httpd: add support for Status: CGI header
authorDenis Vlasenko <vda.linux@googlemail.com>
Sat, 11 Aug 2007 20:20:43 +0000 (20:20 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sat, 11 Aug 2007 20:20:43 +0000 (20:20 -0000)
networking/httpd.c

index 7f2594acab0500ea260573b90b1000157528f450..2f76828c62741c7a8910d4937d32831296e1c92e 100644 (file)
@@ -1043,9 +1043,9 @@ static int sendCgi(const char *url,
                xmove_fd(fromCgi.wr, 1);  /* replace stdout with the pipe */
                close(fromCgi.rd);
                close(toCgi.wr);
-               /* Huh? User seeing stderr can be a security problem...
-                * and if CGI really wants that, it can always dup2(1,2)...
-                * dup2(fromCgi.wr, 2); */
+               /* Huh? User seeing stderr can be a security problem.
+                * If CGI really wants that, it can always dup2(1,2). */
+               /* dup2(1, 2); */
 
                /*
                 * Find PATH_INFO.
@@ -1247,7 +1247,7 @@ static int sendCgi(const char *url,
                                post_read_idx = 0;
                                bodyLen -= count;
                        } else {
-                               bodyLen = 0;    /* closed */
+                               bodyLen = 0; /* closed */
                        }
                }
 
@@ -1274,32 +1274,43 @@ static int sendCgi(const char *url,
                                 * CGI may output a few first bytes and then wait
                                 * for POSTDATA without closing stdout.
                                 * With full_read we may wait here forever. */
-                               count = safe_read(inFd, rbuf + buf_count, PIPESIZE - 4);
+                               count = safe_read(inFd, rbuf + buf_count, PIPESIZE - 8);
                                if (count <= 0) {
                                        /* eof (or error) and there was no "HTTP",
-                                        * so add one and write out the received data */
+                                        * so write it, then write received data */
                                        if (buf_count) {
                                                full_write(s, HTTP_200, sizeof(HTTP_200)-1);
                                                full_write(s, rbuf, buf_count);
                                        }
-                                       break;  /* closed */
+                                       break; /* closed */
                                }
                                buf_count += count;
                                count = 0;
-                               if (buf_count >= 4) {
-                                       /* check to see if CGI added "HTTP" */
+                               /* "Status" header format is: "Status: 302 Redirected\r\n" */
+                               if (buf_count >= 8) {
+                                       if (memcmp(rbuf, "Status: ", 8) == 0) {
+                                               /* send "HTTP/1.0 " */
+                                               if (full_write(s, HTTP_200, 9) != 9)
+                                                       break;
+                                               rbuf += 8; /* skip "Status: " */
+                                               count -= 8;
+                                               buf_count = -1; /* buffering off */
+                                       }
+                               } else if (buf_count >= 4) {
+                                       /* Did CGI add "HTTP"? */
                                        if (memcmp(rbuf, HTTP_200, 4) != 0) {
                                                /* there is no "HTTP", do it ourself */
                                                if (full_write(s, HTTP_200, sizeof(HTTP_200)-1) != sizeof(HTTP_200)-1)
                                                        break;
                                        }
-                                       /* example of valid CGI without "Content-type:"
-                                        * echo -en "HTTP/1.0 302 Found\r\n"
-                                        * echo -en "Location: http://www.busybox.net\r\n"
-                                        * echo -en "\r\n"
+                                       /* Commented out:
                                        if (!strstr(rbuf, "ontent-")) {
                                                full_write(s, "Content-type: text/plain\r\n\r\n", 28);
                                        }
+                                        * Counter-example of valid CGI without Content-type:
+                                        * echo -en "HTTP/1.0 302 Found\r\n"
+                                        * echo -en "Location: http://www.busybox.net\r\n"
+                                        * echo -en "\r\n"
                                         */
                                        count = buf_count;
                                        buf_count = -1; /* buffering off */