418 } |
418 } |
419 char *transfer_encoding = pblock_findkeyval(pb_key_transfer_encoding, rq->rq.headers); |
419 char *transfer_encoding = pblock_findkeyval(pb_key_transfer_encoding, rq->rq.headers); |
420 if(transfer_encoding) { |
420 if(transfer_encoding) { |
421 if(!strcmp(transfer_encoding, "chunked")) { |
421 if(!strcmp(transfer_encoding, "chunked")) { |
422 netbuf *nb = sn->netbuf; |
422 netbuf *nb = sn->netbuf; |
|
423 // a separate buffer is required for reading chunked transfer enc |
423 sn->buffer = pool_malloc(pool, nb->maxsize); |
424 sn->buffer = pool_malloc(pool, nb->maxsize); |
424 if(!sn->buffer) { |
425 if(!sn->buffer) { |
425 pool_destroy(pool); |
426 pool_destroy(pool); |
426 // TODO: error 500 |
427 // TODO: error 500 |
427 return 1; |
428 return 1; |
428 } |
429 } |
|
430 |
|
431 // copy remaining bytes from inbuf to the additional buffer |
429 if(nb->cursize - nb->pos > 0) { |
432 if(nb->cursize - nb->pos > 0) { |
430 memcpy(sn->buffer, nb->inbuf, nb->cursize); |
433 memcpy(sn->buffer, nb->inbuf, nb->cursize); |
431 } |
434 } |
432 |
435 |
433 sn->pos = nb->pos; |
436 sn->pos = nb->pos; |
434 sn->cursize = nb->cursize; |
437 sn->cursize = nb->cursize; |
435 |
438 |
|
439 // clear inbuf |
436 nb->pos = 0; |
440 nb->pos = 0; |
437 nb->cursize = 0; |
441 nb->cursize = 0; |
438 |
442 |
439 if(httpstream_enable_chunked_read(sn->sn.csd, sn->buffer, nb->maxsize, &sn->cursize, &sn->pos)) { |
443 if(httpstream_enable_chunked_read(sn->sn.csd, sn->buffer, nb->maxsize, &sn->cursize, &sn->pos)) { |
440 pool_destroy(pool); |
444 pool_destroy(pool); |