15 #include "identityStreamBuf.h"
19 #include "httpChannel.h"
21 #ifndef HAVE_STREAMSIZE
23 typedef int streamsize;
33 _has_content_length =
true;
35 _wanted_nonblocking =
false;
36 _read_state = ISocketStream::RS_initial;
39 _buffer = (
char *)PANDA_MALLOC_ARRAY(4096);
40 char *ebuf = _buffer + 4096;
41 setg(_buffer, ebuf, ebuf);
46 setg(base(), ebuf(), ebuf());
57 ~IdentityStreamBuf() {
60 PANDA_FREE_ARRAY(_buffer);
71 void IdentityStreamBuf::
72 open_read(BioStreamPtr *source, HTTPChannel *doc,
73 bool has_content_length,
size_t content_length) {
75 _has_content_length = has_content_length;
76 _wanted_nonblocking = doc->_wanted_nonblocking;
77 _bytes_remaining = content_length;
78 _read_state = ISocketStream::RS_reading;
86 void IdentityStreamBuf::
97 int IdentityStreamBuf::
100 if (gptr() >= egptr()) {
101 size_t buffer_size = egptr() - eback();
102 gbump(-(
int)buffer_size);
104 size_t num_bytes = buffer_size;
105 size_t read_count = read_chars(gptr(), buffer_size);
107 if (read_count != num_bytes) {
109 if (read_count == 0) {
115 nassertr(read_count < num_bytes, EOF);
116 size_t delta = num_bytes - read_count;
117 memmove(gptr() + delta, gptr(), read_count);
122 return (
unsigned char)*gptr();
131 size_t IdentityStreamBuf::
132 read_chars(
char *start,
size_t length) {
133 size_t read_count = 0;
135 if (!_has_content_length) {
138 (*_source)->read(start, length);
139 read_count = (*_source)->gcount();
141 if (!_wanted_nonblocking) {
142 while (read_count == 0 && !(*_source)->is_closed()) {
145 (*_source)->read(start, length);
146 read_count = (*_source)->gcount();
150 if (read_count == 0) {
151 if ((*_source)->is_closed()) {
153 _read_state = ISocketStream::RS_complete;
162 if (_bytes_remaining != 0) {
163 length = min(length, _bytes_remaining);
164 (*_source)->read(start, length);
165 read_count = (*_source)->gcount();
166 if (!_wanted_nonblocking) {
167 while (read_count == 0 && !(*_source)->is_closed()) {
170 (*_source)->read(start, length);
171 read_count = (*_source)->gcount();
174 nassertr(read_count <= _bytes_remaining, 0);
175 _bytes_remaining -= read_count;
177 if (read_count == 0) {
178 if ((*_source)->is_closed()) {
180 _read_state = ISocketStream::RS_error;
186 if (_bytes_remaining == 0) {
188 _read_state = ISocketStream::RS_complete;
195 #endif // HAVE_OPENSSL