#include #include #include #include int hredirected(HConnect *c, char *how, char *uri) { Hio *hout; char *s, *ss, *scheme, *host; char sayport[NETPATHLEN]; int n, port; scheme = c->scheme? c->scheme: "http"; port = c->port? atoi(c->port): 80; /* bug? */ host = c->head.host; if(strchr(uri, ':') != nil) host = ""; else if(uri[0] != '/'){ s = strrchr(c->req.uri, '/'); if(s != nil) *s = '\0'; ss = halloc(c, strlen(c->req.uri) + strlen(uri) + 2 + UTFmax); sprint(ss, "%s/%s", c->req.uri, uri); uri = ss; if(s != nil) *s = '/'; } if((strcmp(scheme, "http") == 0 && port == 80) || (strcmp(scheme, "https") == 0 && port == 443) || strchr(host, ':') != nil) sayport[0] = '\0'; else snprint(sayport, sizeof sayport, ":%d", port); n = snprint(c->xferbuf, HBufSize, "Redirection\r\n" "

Redirection

\r\n" "Your selection can be found here.

\r\n", uri); hout = &c->hout; hprint(hout, "%s %s\r\n", hversion, how); hprint(hout, "Date: %D\r\n", time(nil)); hprint(hout, "Server: Plan9\r\n"); hprint(hout, "Content-type: text/html\r\n"); hprint(hout, "Content-Length: %d\r\n", n); if(host == nil || host[0] == 0) hprint(hout, "Location: %U\r\n", uri); else hprint(hout, "Location: %s://%U%s%U\r\n", scheme, host, sayport, uri); if(c->head.closeit) hprint(hout, "Connection: close\r\n"); else if(!http11(c)) hprint(hout, "Connection: Keep-Alive\r\n"); hprint(hout, "\r\n"); if(strcmp(c->req.meth, "HEAD") != 0) hwrite(hout, c->xferbuf, n); if(c->replog) if(host == nil || host[0] == 0) c->replog(c, "Reply: %s\nRedirect: %U\n", how, uri); else c->replog(c, "Reply: %s\nRedirect: %s://%U%s%U\n", how, scheme, host, sayport, uri); return hflush(hout); } int hmoved(HConnect *c, char *uri) { return hredirected(c, "301 Moved Permanently", uri); }