| 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 // |