| 611 return 1; |
611 return 1; |
| 612 } |
612 } |
| 613 client->transfer2_buffer_alloc = HTTP_CLIENT_BUFFER_SIZE; |
613 client->transfer2_buffer_alloc = HTTP_CLIENT_BUFFER_SIZE; |
| 614 client->transfer2_buffer_len = 0; |
614 client->transfer2_buffer_len = 0; |
| 615 client->transfer2_buffer_pos = 0; |
615 client->transfer2_buffer_pos = 0; |
| |
616 |
| |
617 IOStream *fd = Sysstream_new(NULL, client->socketfd); |
| |
618 if(!fd) { |
| |
619 client->error = 1; |
| |
620 return 1; |
| |
621 } |
| |
622 HttpStream *http = (HttpStream*)httpstream_new(NULL, fd); |
| |
623 if(!http) { |
| |
624 fd->free(fd); |
| |
625 } |
| |
626 if(client->buffer.pos < client->buffer.cursize) { |
| |
627 // bytes remaining in the buffer -> enable buffered reading |
| |
628 httpstream_enable_buffered_read( |
| |
629 &http->st, |
| |
630 (char*)client->buffer.inbuf, |
| |
631 client->buffer.maxsize, |
| |
632 &client->buffer.cursize, |
| |
633 &client->buffer.pos); |
| |
634 } |
| |
635 client->stream = http; |
| 616 } else { |
636 } else { |
| 617 // error: unknown protocol |
637 // error: unknown protocol |
| 618 log_ereport(LOG_FAILURE, "http-client: unknown protocol upgrade: %.*s", (int)hdr_upgrade.length, hdr_upgrade.ptr); |
638 log_ereport(LOG_FAILURE, "http-client: unknown protocol upgrade: %.*s", (int)hdr_upgrade.length, hdr_upgrade.ptr); |
| 619 client->error = 1; |
639 client->error = 1; |
| 620 return 1; |
640 return 1; |
| 628 HttpStream *http = (HttpStream*)httpstream_new(NULL, fd); |
648 HttpStream *http = (HttpStream*)httpstream_new(NULL, fd); |
| 629 if(!http) { |
649 if(!http) { |
| 630 fd->free(fd); |
650 fd->free(fd); |
| 631 } |
651 } |
| 632 |
652 |
| 633 // we can reuse the already allocated transfer_bufer for transfer2 |
653 // we can reuse the already allocated transfer_buffer for transfer2 |
| 634 client->transfer2_buffer = client->transfer_buffer; |
654 client->transfer2_buffer = client->transfer_buffer; |
| 635 client->transfer2_buffer_alloc = client->transfer_buffer_alloc; |
655 client->transfer2_buffer_alloc = client->transfer_buffer_alloc; |
| 636 client->transfer2_buffer_len = 0; |
656 client->transfer2_buffer_len = 0; |
| 637 client->transfer_buffer_pos = 0; |
657 client->transfer_buffer_pos = 0; |
| 638 client->transfer_buffer = NULL; |
658 client->transfer_buffer = NULL; |
| 639 client->transfer_buffer_alloc = 0; |
659 client->transfer_buffer_alloc = 0; |
| 640 |
660 |
| 641 if(contentlength > 0) { |
661 if(contentlength > 0) { |
| 642 http->max_read = contentlength; |
662 http->max_read = contentlength; |
| 643 httpstream_enable_buffered_read(&http->st, (char*)client->buffer.inbuf, client->buffer.maxsize, &client->buffer.cursize, &client->buffer.pos); |
663 httpstream_enable_buffered_read( |
| |
664 &http->st, |
| |
665 (char*)client->buffer.inbuf, |
| |
666 client->buffer.maxsize, |
| |
667 &client->buffer.cursize, |
| |
668 &client->buffer.pos); |
| 644 } else if(chunkedtransferenc) { |
669 } else if(chunkedtransferenc) { |
| 645 httpstream_enable_chunked_read(&http->st, (char*)client->buffer.inbuf, client->buffer.maxsize, &client->buffer.cursize, &client->buffer.pos); |
670 httpstream_enable_chunked_read( |
| |
671 &http->st, |
| |
672 (char*)client->buffer.inbuf, |
| |
673 client->buffer.maxsize, |
| |
674 &client->buffer.cursize, |
| |
675 &client->buffer.pos); |
| 646 } |
676 } |
| 647 client->stream = http; |
677 client->stream = http; |
| 648 } |
678 } |
| 649 |
679 |
| 650 return 0; |
680 return 0; |