25 _has_content_length =
true;
27 _wanted_nonblocking =
false;
28 _read_state = ISocketStream::RS_initial;
31 _buffer = (
char *)PANDA_MALLOC_ARRAY(4096);
32 char *ebuf = _buffer + 4096;
33 setg(_buffer, ebuf, ebuf);
38 setg(base(), ebuf(), ebuf());
47 ~IdentityStreamBuf() {
50 PANDA_FREE_ARRAY(_buffer);
58 void IdentityStreamBuf::
59 open_read(BioStreamPtr *source, HTTPChannel *doc,
60 bool has_content_length,
size_t content_length) {
62 _has_content_length = has_content_length;
63 _wanted_nonblocking = doc->_wanted_nonblocking;
64 _bytes_remaining = content_length;
65 _read_state = ISocketStream::RS_reading;
71 void IdentityStreamBuf::
80 int IdentityStreamBuf::
83 if (gptr() >= egptr()) {
84 size_t buffer_size = egptr() - eback();
85 gbump(-(
int)buffer_size);
87 size_t num_bytes = buffer_size;
88 size_t read_count = read_chars(gptr(), buffer_size);
90 if (read_count != num_bytes) {
92 if (read_count == 0) {
98 nassertr(read_count < num_bytes, EOF);
99 size_t delta = num_bytes - read_count;
100 memmove(gptr() + delta, gptr(), read_count);
105 return (
unsigned char)*gptr();
112 size_t IdentityStreamBuf::
113 read_chars(
char *start,
size_t length) {
114 size_t read_count = 0;
116 if (!_has_content_length) {
118 (*_source)->read(start, length);
119 read_count = (*_source)->gcount();
121 if (!_wanted_nonblocking) {
122 while (read_count == 0 && !(*_source)->is_closed()) {
125 (*_source)->read(start, length);
126 read_count = (*_source)->gcount();
130 if (read_count == 0) {
131 if ((*_source)->is_closed()) {
133 _read_state = ISocketStream::RS_complete;
142 if (_bytes_remaining != 0) {
143 length = std::min(length, _bytes_remaining);
144 (*_source)->read(start, length);
145 read_count = (*_source)->gcount();
146 if (!_wanted_nonblocking) {
147 while (read_count == 0 && !(*_source)->is_closed()) {
150 (*_source)->read(start, length);
151 read_count = (*_source)->gcount();
154 nassertr(read_count <= _bytes_remaining, 0);
155 _bytes_remaining -= read_count;
157 if (read_count == 0) {
158 if ((*_source)->is_closed()) {
160 _read_state = ISocketStream::RS_error;
166 if (_bytes_remaining == 0) {
168 _read_state = ISocketStream::RS_complete;
175 #endif // HAVE_OPENSSL PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.