57 (io_writev_f)net_stream_writev, |
57 (io_writev_f)net_stream_writev, |
58 (io_read_f)net_stream_read, |
58 (io_read_f)net_stream_read, |
59 (io_sendfile_f)net_stream_sendfile, |
59 (io_sendfile_f)net_stream_sendfile, |
60 (io_close_f)net_stream_close, |
60 (io_close_f)net_stream_close, |
61 (io_finish_f)net_stream_finish |
61 (io_finish_f)net_stream_finish |
|
62 }; |
|
63 |
|
64 IOStream ssl_io_funcs = { |
|
65 (io_write_f)net_ssl_write, |
|
66 (io_writev_f)net_ssl_writev, |
|
67 (io_read_f)net_ssl_read, |
|
68 NULL, |
|
69 (io_close_f)net_ssl_close, |
|
70 (io_finish_f)net_ssl_finish |
62 }; |
71 }; |
63 |
72 |
64 |
73 |
65 IOStream* stream_new_from_fd(pool_handle_t *pool, int fd) { |
74 IOStream* stream_new_from_fd(pool_handle_t *pool, int fd) { |
66 SystemIOStream *st = pool_malloc(pool, sizeof(SystemIOStream)); |
75 SystemIOStream *st = pool_malloc(pool, sizeof(SystemIOStream)); |
189 |
198 |
190 void net_stream_finish(NetIOStream *st) { |
199 void net_stream_finish(NetIOStream *st) { |
191 if(st->chunked_enc) { |
200 if(st->chunked_enc) { |
192 write(st->fd, "0\r\n\r\n", 5); |
201 write(st->fd, "0\r\n\r\n", 5); |
193 } |
202 } |
|
203 } |
|
204 |
|
205 |
|
206 /* ssl stream */ |
|
207 IOStream* net_ssl_stream(pool_handle_t *pool, SSL *ssl) { |
|
208 SSLStream *st = pool_malloc(pool, sizeof(SSLStream)); |
|
209 st->st = ssl_io_funcs; |
|
210 st->ssl = ssl; |
|
211 return (IOStream*)st; |
|
212 } |
|
213 |
|
214 ssize_t net_ssl_write(SSLStream *st, void *buf, size_t nbytes) { |
|
215 return SSL_write(st->ssl, buf, nbytes); |
|
216 } |
|
217 |
|
218 ssize_t net_ssl_writev(SSLStream *st, struct iovec *iovec, int iovcnt) { |
|
219 ssize_t r = 0; |
|
220 for(int i=0;i<iovcnt;i++) { |
|
221 int ret = SSL_write(st->ssl, iovec[i].iov_base, iovec[i].iov_len); |
|
222 if(ret <= 0) { |
|
223 return 0; |
|
224 } |
|
225 r += ret; |
|
226 } |
|
227 return r; |
|
228 } |
|
229 |
|
230 ssize_t net_ssl_read(SSLStream *st, void *buf, size_t nbytes) { |
|
231 return SSL_read(st->ssl, buf, nbytes); |
|
232 } |
|
233 |
|
234 void net_ssl_close(SSLStream *st) { |
|
235 SSL_shutdown(st->ssl); |
|
236 close(SSL_get_fd(st->ssl)); |
|
237 } |
|
238 |
|
239 void net_ssl_finish(SSLStream *st) { |
|
240 |
194 } |
241 } |
195 |
242 |
196 |
243 |
197 ssize_t net_read(SYS_NETFD fd, void *buf, size_t nbytes) { |
244 ssize_t net_read(SYS_NETFD fd, void *buf, size_t nbytes) { |
198 ssize_t r = ((IOStream*)fd)->read(fd, buf, nbytes); |
245 ssize_t r = ((IOStream*)fd)->read(fd, buf, nbytes); |