src/server/daemon/protocol.c

changeset 65
14722c5f8856
parent 48
37a512d7b8f6
child 66
74babc0082b7
--- a/src/server/daemon/protocol.c	Wed May 22 13:27:31 2013 +0200
+++ b/src/server/daemon/protocol.c	Wed May 22 15:05:06 2013 +0200
@@ -278,36 +278,64 @@
 }
 
 int http_start_response(Session *sn, Request *rq) {
-    int fd = ((SystemIOStream*)sn->csd)->fd;
+    int fd = ((NetIOStream*)sn->csd)->fd;
 
     if(rq->status_num == -1) {
         protocol_status(sn, rq, 200, "OK");
     }
 
-    /* set socket blocking */
+    // set socket blocking
     int flags;
     flags = fcntl(fd, F_GETFL, 0);
     fcntl(fd, F_SETFL, flags ^ O_NONBLOCK);
 
-    /* output buffer */
+    // output buffer
     sbuf_t *out = sbuf_new(512);
 
-    /* add the http status line to the output buffer */
+    // add the http status line to the output buffer
     add_http_status_line(out, sn->pool, rq);
 
-    /* add server header */
+    // add server header
     sbuf_write(out, "Server: webserver\r\n", 19);
-
-    /* add header from rq->srvhdrs */
+    
+    // check content length ans transfer encoding
+    char *ctlen = pblock_findkeyval(pb_key_content_length, rq->srvhdrs);
+    char *enc = pblock_findkeyval(pb_key_transfer_encoding, rq->srvhdrs);
+    if(ctlen && enc) {
+        pblock_removekey(pb_key_transfer_encoding, rq->srvhdrs);
+    }
+    if(!ctlen) {
+        // set transfer-encoding header
+        if(!enc) {
+            pblock_kvinsert(
+                    pb_key_transfer_encoding,
+                    "chunked",
+                    7,
+                    rq->srvhdrs);
+        } else if(strcmp(enc, "chunked")) {
+            pblock_removekey(pb_key_transfer_encoding, rq->srvhdrs);
+            pblock_kvinsert(
+                    pb_key_transfer_encoding,
+                    "chunked",
+                    7,
+                    rq->srvhdrs);
+        }
+        
+        // set stream property
+        NetIOStream *stream = (NetIOStream*)sn->csd;
+        stream->chunkedenc = 1;
+    }
+    
+    // add header from rq->srvhdrs
     add_http_response_header(out, rq);
     
-    /* add connection header */
+    // add connection header
     sbuf_write(out, "Connection: close\r\n", 19);
 
-    /* response header end */
+    // response header end
     sbuf_write(out, "\r\n", 2);
 
-    /* flush buffer to the socket */
+    // flush buffer to the socket
     write(fd, out->ptr, out->length);
     sbuf_free(out);
     

mercurial