53 int connection_write(Connection *conn, const void *buf, int len) { |
53 int connection_write(Connection *conn, const void *buf, int len) { |
54 return (int)write(conn->fd, buf, len); |
54 return (int)write(conn->fd, buf, len); |
55 } |
55 } |
56 |
56 |
57 void connection_close(Connection *conn) { |
57 void connection_close(Connection *conn) { |
58 close(conn->fd); |
58 while(close(conn->fd)) { |
|
59 if(errno != EINTR) { |
|
60 log_ereport(LOG_VERBOSE, "connection close failed: %s", strerror(errno)); |
|
61 break; |
|
62 } |
|
63 } |
59 } |
64 } |
60 |
65 |
61 int connection_ssl_read(Connection *conn, void *buf, int len) { |
66 int connection_ssl_read(Connection *conn, void *buf, int len) { |
62 int ret = SSL_read(conn->ssl, buf, len); |
67 int ret = SSL_read(conn->ssl, buf, len); |
63 if(ret <= 0) { |
68 if(ret <= 0) { |
80 if(ret != 1) { |
85 if(ret != 1) { |
81 conn->ssl_error = SSL_get_error(conn->ssl, ret); |
86 conn->ssl_error = SSL_get_error(conn->ssl, ret); |
82 log_ereport(LOG_VERBOSE, "SSL_shutdown failed: %d", conn->ssl_error); |
87 log_ereport(LOG_VERBOSE, "SSL_shutdown failed: %d", conn->ssl_error); |
83 } |
88 } |
84 } |
89 } |
85 close(conn->fd); |
90 while(close(conn->fd)) { |
|
91 if(errno != EINTR) { |
|
92 log_ereport(LOG_VERBOSE, "connection close failed: %s", strerror(errno)); |
|
93 break; |
|
94 } |
|
95 } |
86 } |
96 } |
87 |
97 |
88 void connection_destroy(Connection *conn) { |
98 void connection_destroy(Connection *conn) { |
89 conn->close(conn); |
99 conn->close(conn); |
90 if(conn->ssl) { |
100 if(conn->ssl) { |
318 HTTPRequest *request = io->request; |
328 HTTPRequest *request = io->request; |
319 |
329 |
320 int r = handle_request(request, NULL); |
330 int r = handle_request(request, NULL); |
321 if(r != 0) { |
331 if(r != 0) { |
322 // TODO: error message |
332 // TODO: error message |
323 close(request->connection->fd); |
333 connection_destroy(request->connection); |
324 } |
334 } |
325 |
335 |
326 /* |
336 /* |
327 * handle_request can return before the request is finished, but it copies |
337 * handle_request can return before the request is finished, but it copies |
328 * all important data. We can free request, parser and event |
338 * all important data. We can free request, parser and event |