diff -r c7f5b062e622 -r 14722c5f8856 src/server/daemon/protocol.c --- 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);