src/server/daemon/httprequest.c

changeset 683
db37761a8494
parent 671
879005903b2b
equal deleted inserted replaced
682:f4c593a99266 683:db37761a8494
397 } 397 }
398 } 398 }
399 399
400 // check for request body and prepare input buffer 400 // check for request body and prepare input buffer
401 char *ctlen_str = pblock_findkeyval(pb_key_content_length, rq->rq.headers); 401 char *ctlen_str = pblock_findkeyval(pb_key_content_length, rq->rq.headers);
402 if(ctlen_str) { 402 char *transfer_encoding = pblock_findkeyval(pb_key_transfer_encoding, rq->rq.headers);
403 if(ctlen_str || transfer_encoding) {
404 netbuf *nb = sn->netbuf;
405 HttpStream *net_io = (HttpStream*)sn->sn.csd;
406
407 // a separate buffer is required for reading chunked transfer enc
408 sn->buffer = pool_malloc(pool, nb->maxsize);
409 if(!sn->buffer) {
410 request->status = 503;
411 return 1;
412 }
413
414 // copy remaining bytes from inbuf to the additional buffer
415 if(nb->cursize - nb->pos > 0) {
416 memcpy(sn->buffer, nb->inbuf, nb->cursize);
417 }
418
419 sn->pos = nb->pos;
420 sn->cursize = nb->cursize;
421
422 // clear inbuf
423 nb->pos = 0;
424 nb->cursize = 0;
425
403 int64_t ctlen; 426 int64_t ctlen;
404 if(util_strtoint(ctlen_str, &ctlen)) { 427 if(ctlen_str && util_strtoint(ctlen_str, &ctlen)) {
405 netbuf *nb = sn->netbuf;
406 HttpStream *net_io = (HttpStream*)sn->sn.csd;
407 net_io->read_eof = WS_FALSE; 428 net_io->read_eof = WS_FALSE;
408 429 if(httpstream_enable_buffered_read(sn->sn.csd, sn->buffer, nb->maxsize, &sn->cursize, &sn->pos)) {
430 request->status = 500; // should not happen
431 return 1;
432 }
433
409 // how many bytes are already read and in the buffer 434 // how many bytes are already read and in the buffer
410 int cur_input_available = nb->cursize - nb->pos; 435 int cur_input_available = nb->cursize - nb->pos;
411 436
412 if(cur_input_available >= ctlen) { 437 if(cur_input_available >= ctlen) {
413 // we have the whole request body in the buffer and 438 // we have the whole request body in the buffer and
414 // maybe even more 439 // maybe even more
415 // no more read from the socket is necessary to get the body, 440 // no more read from the socket is necessary to get the body,
416 // therefore disable it 441 // therefore disable it
417 net_io->max_read = 0; 442 net_io->max_read = 0;
418 } else { 443 } else {
419 // read still required to get the complete request body 444 // read still required to get the complete request body
420 net_io->max_read = ctlen - cur_input_available; 445 net_io->max_read = ctlen - cur_input_available;
421 } 446 }
422 //printf("request body length: %d\n", ctlen); 447 } else if (transfer_encoding) {
423 } // else: should we abort?
424 }
425 char *transfer_encoding = pblock_findkeyval(pb_key_transfer_encoding, rq->rq.headers);
426 if(transfer_encoding) {
427 if(!strcmp(transfer_encoding, "chunked")) {
428 netbuf *nb = sn->netbuf;
429 // a separate buffer is required for reading chunked transfer enc
430 sn->buffer = pool_malloc(pool, nb->maxsize);
431 if(!sn->buffer) {
432 request->status = 503;
433 return 1;
434 }
435
436 // copy remaining bytes from inbuf to the additional buffer
437 if(nb->cursize - nb->pos > 0) {
438 memcpy(sn->buffer, nb->inbuf, nb->cursize);
439 }
440
441 sn->pos = nb->pos;
442 sn->cursize = nb->cursize;
443
444 // clear inbuf
445 nb->pos = 0;
446 nb->cursize = 0;
447
448 if(httpstream_enable_chunked_read(sn->sn.csd, sn->buffer, nb->maxsize, &sn->cursize, &sn->pos)) { 448 if(httpstream_enable_chunked_read(sn->sn.csd, sn->buffer, nb->maxsize, &sn->cursize, &sn->pos)) {
449 request->status = 500; // should not happen 449 request->status = 500; // should not happen
450 return 1; 450 return 1;
451 } 451 }
452 } // else: TODO: unknown transfer encoding error 452 }
453 } 453 }
454 454
455 // 455 //
456 // Send the request to the NSAPI system 456 // Send the request to the NSAPI system
457 // 457 //

mercurial