dovecot-2.2: lib-http server: Removed "bool close" parameters in...
dovecot at dovecot.org
dovecot at dovecot.org
Tue Aug 5 14:09:49 UTC 2014
details: http://hg.dovecot.org/dovecot-2.2/rev/898d4cce2aa9
changeset: 17676:898d4cce2aa9
user: Timo Sirainen <tss at iki.fi>
date: Tue Aug 05 16:07:25 2014 +0200
description:
lib-http server: Removed "bool close" parameters in favor of _close() functions.
Most callers don't want to close the connection so it's an extra parameter
usually. Also it's difficult to remember what the TRUE/FALSE means so it's
easy to cause bugs by copy&pasting the code.
http_server_request_fail() will also now forcibly close the connection if
conn->input_broken is set.
diffstat:
src/lib-http/http-server-connection.c | 25 ++++++++++++-------------
src/lib-http/http-server-request.c | 20 ++++++++++++++++++--
src/lib-http/http-server-response.c | 13 ++++++++++---
src/lib-http/http-server.h | 11 +++++++++--
4 files changed, 49 insertions(+), 20 deletions(-)
diffs (174 lines):
diff -r cac32684b3d6 -r 898d4cce2aa9 src/lib-http/http-server-connection.c
--- a/src/lib-http/http-server-connection.c Mon Aug 04 14:05:51 2014 +0200
+++ b/src/lib-http/http-server-connection.c Tue Aug 05 16:07:25 2014 +0200
@@ -206,13 +206,13 @@
conn->input_broken = TRUE;
http_server_connection_client_error(conn,
"Client sent excessively large request");
- http_server_request_fail(req, 413, "Payload Too Large", TRUE);
+ http_server_request_fail_close(req, 413, "Payload Too Large");
return;
case EIO:
conn->input_broken = TRUE;
http_server_connection_client_error(conn,
"Client sent invalid request payload");
- http_server_request_fail(req, 400, "Bad Request", conn->input_broken);
+ http_server_request_fail_close(req, 400, "Bad Request");
return;
default:
break;
@@ -243,11 +243,11 @@
/* CONNECT method */
if (strcmp(req->req.method, "CONNECT") == 0) {
if (conn->callbacks->handle_connect_request == NULL) {
- http_server_request_fail(req, 505, "Not Implemented", FALSE);
+ http_server_request_fail(req, 505, "Not Implemented");
return;
}
if (req->req.target.format != HTTP_REQUEST_TARGET_FORMAT_AUTHORITY) {
- http_server_request_fail(req, 400, "Bad Request", FALSE);
+ http_server_request_fail(req, 400, "Bad Request");
return;
}
conn->callbacks->handle_connect_request
@@ -256,7 +256,7 @@
/* other methods */
} else {
if (conn->callbacks->handle_request == NULL) {
- http_server_request_fail(req, 505, "Not Implemented", FALSE);
+ http_server_request_fail(req, 505, "Not Implemented");
return;
} else {
conn->callbacks->handle_request(conn->context, req);
@@ -273,7 +273,7 @@
i_assert(conn->incoming_payload == NULL);
if (req->req.version_major != 1) {
- http_server_request_fail(req, 505, "HTTP Version Not Supported", FALSE);
+ http_server_request_fail(req, 505, "HTTP Version Not Supported");
return TRUE;
}
@@ -492,24 +492,23 @@
case HTTP_REQUEST_PARSE_ERROR_BROKEN_REQUEST:
conn->input_broken = TRUE;
case HTTP_REQUEST_PARSE_ERROR_BAD_REQUEST:
- http_server_request_fail(req, 400, "Bad Request", conn->input_broken);
+ http_server_request_fail(req, 400, "Bad Request");
break;
- case HTTP_REQUEST_PARSE_ERROR_METHOD_TOO_LONG:
+ case HTTP_REQUEST_PARSE_ERROR_METHOD_TOO_LONG:
conn->input_broken = TRUE;
case HTTP_REQUEST_PARSE_ERROR_NOT_IMPLEMENTED:
- http_server_request_fail(req,
- 501, "Not Implemented", conn->input_broken);
+ http_server_request_fail(req, 501, "Not Implemented");
break;
case HTTP_REQUEST_PARSE_ERROR_TARGET_TOO_LONG:
- http_server_request_fail(req, 414, "URI Too Long", TRUE);
conn->input_broken = TRUE;
+ http_server_request_fail_close(req, 414, "URI Too Long");
break;
case HTTP_REQUEST_PARSE_ERROR_EXPECTATION_FAILED:
- http_server_request_fail(req, 417, "Expectation Failed", FALSE);
+ http_server_request_fail(req, 417, "Expectation Failed");
break;
case HTTP_REQUEST_PARSE_ERROR_PAYLOAD_TOO_LARGE:
- http_server_request_fail(req, 413, "Payload Too Large", TRUE);
conn->input_broken = TRUE;
+ http_server_request_fail_close(req, 413, "Payload Too Large");
break;
return;
default:
diff -r cac32684b3d6 -r 898d4cce2aa9 src/lib-http/http-server-request.c
--- a/src/lib-http/http-server-request.c Mon Aug 04 14:05:51 2014 +0200
+++ b/src/lib-http/http-server-request.c Tue Aug 05 16:07:25 2014 +0200
@@ -174,7 +174,8 @@
http_server_connection_send_responses(conn);
}
-void http_server_request_fail(struct http_server_request *req,
+static void
+http_server_request_fail_full(struct http_server_request *req,
unsigned int status, const char *reason, bool close)
{
struct http_server_response *resp;
@@ -185,6 +186,21 @@
reason = t_strconcat(reason, "\r\n", NULL);
http_server_response_set_payload_data
(resp, (const unsigned char *)reason, strlen(reason));
- http_server_response_submit(resp, close);
+ if (close)
+ http_server_response_submit_close(resp);
+ else
+ http_server_response_submit(resp);
}
+void http_server_request_fail(struct http_server_request *req,
+ unsigned int status, const char *reason)
+{
+ http_server_request_fail_full(req, status, reason,
+ req->conn->input_broken);
+}
+
+void http_server_request_fail_close(struct http_server_request *req,
+ unsigned int status, const char *reason)
+{
+ http_server_request_fail_full(req, status, reason, TRUE);
+}
diff -r cac32684b3d6 -r 898d4cce2aa9 src/lib-http/http-server-response.c
--- a/src/lib-http/http-server-response.c Mon Aug 04 14:05:51 2014 +0200
+++ b/src/lib-http/http-server-response.c Tue Aug 05 16:07:25 2014 +0200
@@ -142,13 +142,20 @@
http_server_request_submit_response(resp->request);
}
-void http_server_response_submit(struct http_server_response *resp,
- bool close)
+void http_server_response_submit(struct http_server_response *resp)
{
i_assert(!resp->submitted);
http_server_response_debug(resp, "Submitted");
- http_server_response_do_submit(resp, close);
+ http_server_response_do_submit(resp, FALSE);
+}
+
+void http_server_response_submit_close(struct http_server_response *resp)
+{
+ i_assert(!resp->submitted);
+ http_server_response_debug(resp, "Submitted");
+
+ http_server_response_do_submit(resp, TRUE);
}
void http_server_response_submit_tunnel(struct http_server_response *resp,
diff -r cac32684b3d6 -r 898d4cce2aa9 src/lib-http/http-server.h
--- a/src/lib-http/http-server.h Mon Aug 04 14:05:51 2014 +0200
+++ b/src/lib-http/http-server.h Tue Aug 05 16:07:25 2014 +0200
@@ -65,8 +65,13 @@
const struct http_request *
http_server_request_get(struct http_server_request *req);
pool_t http_server_request_get_pool(struct http_server_request *req);
+/* Send a failure response to the request with given status/reason. */
void http_server_request_fail(struct http_server_request *req,
- unsigned int status, const char *reason, bool close);
+ unsigned int status, const char *reason);
+/* Send a failure response to the request with given status/reason
+ and close the connection. */
+void http_server_request_fail_close(struct http_server_request *req,
+ unsigned int status, const char *reason);
/* Call the specified callback when HTTP request is destroyed. */
void http_server_request_set_destroy_callback(struct http_server_request *req,
@@ -84,7 +89,9 @@
struct istream *input);
void http_server_response_set_payload_data(struct http_server_response *resp,
const unsigned char *data, size_t size);
-void http_server_response_submit(struct http_server_response *resp, bool close);
+void http_server_response_submit(struct http_server_response *resp);
+/* Submit response and close the connection. */
+void http_server_response_submit_close(struct http_server_response *resp);
void http_server_response_submit_tunnel(struct http_server_response *resp,
http_server_tunnel_callback_t callback, void *context);
More information about the dovecot-cvs
mailing list