URI:
       tredirected.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tredirected.c (1554B)
       ---
            1 #include <u.h>
            2 #include <libc.h>
            3 #include <bin.h>
            4 #include <httpd.h>
            5 
            6 int
            7 hredirected(HConnect *c, char *how, char *uri)
            8 {
            9         Hio *hout;
           10         char *s, *ss, *host;
           11         int n;
           12 
           13         host = c->head.host;
           14         if(strchr(uri, ':')){
           15                 host = "";
           16         }else if(uri[0] != '/'){
           17                 s = strrchr(c->req.uri, '/');
           18                 if(s != nil)
           19                         *s = '\0';
           20                 ss = halloc(c, strlen(c->req.uri) + strlen(uri) + 2 + UTFmax);
           21                 sprint(ss, "%s/%s", c->req.uri, uri);
           22                 uri = ss;
           23                 if(s != nil)
           24                         *s = '/';
           25         }
           26 
           27         n = snprint(c->xferbuf, HBufSize,
           28                         "<head><title>Redirection</title></head>\r\n"
           29                         "<body><h1>Redirection</h1>\r\n"
           30                         "Your selection can be found <a href=\"%U\"> here</a>.<p></body>\r\n", uri);
           31 
           32         hout = &c->hout;
           33         hprint(hout, "%s %s\r\n", hversion, how);
           34         hprint(hout, "Date: %D\r\n", time(nil));
           35         hprint(hout, "Server: Plan9\r\n");
           36         hprint(hout, "Content-type: text/html\r\n");
           37         hprint(hout, "Content-Length: %d\r\n", n);
           38         if(host == nil || host[0] == 0)
           39                 hprint(hout, "Location: %U\r\n", uri);
           40         else
           41                 hprint(hout, "Location: http://%U%U\r\n", host, uri);
           42         if(c->head.closeit)
           43                 hprint(hout, "Connection: close\r\n");
           44         else if(!http11(c))
           45                 hprint(hout, "Connection: Keep-Alive\r\n");
           46         hprint(hout, "\r\n");
           47 
           48         if(strcmp(c->req.meth, "HEAD") != 0)
           49                 hwrite(hout, c->xferbuf, n);
           50 
           51         if(c->replog){
           52                 if(host == nil || host[0] == 0)
           53                         c->replog(c, "Reply: %s\nRedirect: %U\n", how, uri);
           54                 else
           55                         c->replog(c, "Reply: %s\nRedirect: http://%U%U\n", how, host, uri);
           56         }
           57         return hflush(hout);
           58 }
           59 
           60 int
           61 hmoved(HConnect *c, char *uri)
           62 {
           63         return hredirected(c, "301 Moved Permanently", uri);
           64 }