57 |
57 |
58 typedef struct IOStream IOStream; |
58 typedef struct IOStream IOStream; |
59 typedef struct Sysstream Sysstream; |
59 typedef struct Sysstream Sysstream; |
60 typedef struct HttpStream HttpStream; |
60 typedef struct HttpStream HttpStream; |
61 |
61 |
62 typedef ssize_t(*io_write_f)(IOStream *, void *, size_t); |
62 typedef ssize_t(*io_write_f)(IOStream *, const void *, size_t); |
63 typedef ssize_t(*io_writev_f)(IOStream *, struct iovec *, int); |
63 typedef ssize_t(*io_writev_f)(IOStream *, struct iovec *, int); |
64 typedef ssize_t(*io_read_f)(IOStream *, void *, size_t); |
64 typedef ssize_t(*io_read_f)(IOStream *, void *, size_t); |
65 typedef ssize_t(*io_sendfile_f)(IOStream *, sendfiledata *); |
65 typedef ssize_t(*io_sendfile_f)(IOStream *, sendfiledata *); |
66 typedef void(*io_close_f)(IOStream *); |
66 typedef void(*io_close_f)(IOStream *); |
67 typedef void(*io_finish_f)(IOStream *); |
67 typedef void(*io_finish_f)(IOStream *); |
134 /* |
134 /* |
135 * chunked transfer encoding for write enabled? |
135 * chunked transfer encoding for write enabled? |
136 */ |
136 */ |
137 WSBool chunked_enc; |
137 WSBool chunked_enc; |
138 /* |
138 /* |
|
139 * current chunk size (set after the header is sent) |
|
140 */ |
|
141 size_t current_chunk_length; |
|
142 /* |
|
143 * current chunk position |
|
144 */ |
|
145 size_t current_chunk_pos; |
|
146 /* |
|
147 * missing trailer before new data |
|
148 * 0: no trailer |
|
149 * 2: crlf |
|
150 * 1: lf |
|
151 */ |
|
152 int current_trailer; |
|
153 /* |
|
154 * write chunk header buffer |
|
155 */ |
|
156 char write_chunk_buf[HTTP_STREAM_CBUF_SIZE]; |
|
157 /* |
|
158 * chunk header buffer length |
|
159 * only used when the chunk header was completely sent |
|
160 * must be 0 before payload data is sent |
|
161 */ |
|
162 int write_chunk_buf_len; |
|
163 /* |
|
164 * current write_chunk_buf position (if remaining != 0) |
|
165 */ |
|
166 int write_chunk_buf_pos; |
|
167 /* |
139 * end of file indicator (read) |
168 * end of file indicator (read) |
140 */ |
169 */ |
141 WSBool read_eof; |
170 WSBool read_eof; |
142 /* |
171 /* |
143 * end of file indicator (write) |
172 * end of file indicator (write) |
154 |
183 |
155 |
184 |
156 /* system stream */ |
185 /* system stream */ |
157 IOStream* Sysstream_new(pool_handle_t *pool, SYS_SOCKET fd); |
186 IOStream* Sysstream_new(pool_handle_t *pool, SYS_SOCKET fd); |
158 |
187 |
159 ssize_t net_sys_write(Sysstream *st, void *buf, size_t nbytes); |
188 ssize_t net_sys_write(Sysstream *st, const void *buf, size_t nbytes); |
160 ssize_t net_sys_writev(Sysstream *st, struct iovec *iovec, int iovcnt); |
189 ssize_t net_sys_writev(Sysstream *st, struct iovec *iovec, int iovcnt); |
161 ssize_t net_sys_read(Sysstream *st, void *buf, size_t nbytes); |
190 ssize_t net_sys_read(Sysstream *st, void *buf, size_t nbytes); |
162 ssize_t net_sys_sendfile(Sysstream *st, sendfiledata *sfd); |
191 ssize_t net_sys_sendfile(Sysstream *st, sendfiledata *sfd); |
163 void net_sys_close(Sysstream *st); |
192 void net_sys_close(Sysstream *st); |
164 void net_sys_setmode(Sysstream *st, int mode); |
193 void net_sys_setmode(Sysstream *st, int mode); |
171 int httpstream_enable_chunked_write(IOStream *st); |
200 int httpstream_enable_chunked_write(IOStream *st); |
172 int httpstream_set_max_read(IOStream *st, int64_t maxread); |
201 int httpstream_set_max_read(IOStream *st, int64_t maxread); |
173 WSBool httpstream_eof(IOStream *st); |
202 WSBool httpstream_eof(IOStream *st); |
174 int64_t httpstream_written(IOStream *st); |
203 int64_t httpstream_written(IOStream *st); |
175 |
204 |
176 ssize_t net_http_write(HttpStream *st, void *buf, size_t nbytes); |
205 ssize_t net_http_write(HttpStream *st, const void *buf, size_t nbytes); |
177 ssize_t net_http_writev(HttpStream *st, struct iovec *iovec, int iovcnt); |
206 ssize_t net_http_writev(HttpStream *st, struct iovec *iovec, int iovcnt); |
178 ssize_t net_http_read(HttpStream *st, void *buf, size_t nbytes); |
207 ssize_t net_http_read(HttpStream *st, void *buf, size_t nbytes); |
179 ssize_t net_http_read_chunked(HttpStream *st, void *buf, size_t nbytes); |
208 ssize_t net_http_read_chunked(HttpStream *st, void *buf, size_t nbytes); |
180 ssize_t net_http_sendfile(HttpStream *st, sendfiledata *sfd); |
209 ssize_t net_http_sendfile(HttpStream *st, sendfiledata *sfd); |
181 void net_http_close(HttpStream *st); |
210 void net_http_close(HttpStream *st); |
182 void net_http_finish(HttpStream *st); |
211 void net_http_finish(HttpStream *st); |
183 void net_http_setmode(HttpStream *st, int mode); |
212 void net_http_setmode(HttpStream *st, int mode); |
184 int net_http_poll(HttpStream *st, EventHandler *ev, int events, Event *cb); |
213 int net_http_poll(HttpStream *st, EventHandler *ev, int events, Event *cb); |
185 |
214 |
|
215 int http_stream_parse_chunk_header(char *str, int len, WSBool first, int64_t *chunklen); |
|
216 |
186 /* ssl stream */ |
217 /* ssl stream */ |
187 IOStream* sslstream_new(pool_handle_t *pool, SSL *ssl); |
218 IOStream* sslstream_new(pool_handle_t *pool, SSL *ssl); |
188 |
219 |
189 ssize_t net_ssl_write(SSLStream *st, void *buf, size_t nbytes); |
220 ssize_t net_ssl_write(SSLStream *st, const void *buf, size_t nbytes); |
190 ssize_t net_ssl_writev(SSLStream *st, struct iovec *iovec, int iovcnt); |
221 ssize_t net_ssl_writev(SSLStream *st, struct iovec *iovec, int iovcnt); |
191 ssize_t net_ssl_read(SSLStream *st, void *buf, size_t nbytes); |
222 ssize_t net_ssl_read(SSLStream *st, void *buf, size_t nbytes); |
192 void net_ssl_close(SSLStream *st); |
223 void net_ssl_close(SSLStream *st); |
193 void net_ssl_finish(SSLStream *st); |
224 void net_ssl_finish(SSLStream *st); |
194 void net_ssl_setmode(SSLStream *st, int mode); |
225 void net_ssl_setmode(SSLStream *st, int mode); |