]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-http server: Removed "bool close" parameters in favor of _close() functions.
authorTimo Sirainen <tss@iki.fi>
Tue, 5 Aug 2014 14:07:25 +0000 (16:07 +0200)
committerTimo Sirainen <tss@iki.fi>
Tue, 5 Aug 2014 14:07:25 +0000 (16:07 +0200)
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.

src/lib-http/http-server-connection.c
src/lib-http/http-server-request.c
src/lib-http/http-server-response.c
src/lib-http/http-server.h

index 00b2b3ce67e141df4a4709e01b9f4eb0d23843a8..c1dfe1b8b0bb76738128c30c69db51dda0c0ac70 100644 (file)
@@ -206,13 +206,13 @@ static void http_server_payload_destroyed(struct http_server_request *req)
                        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 @@ static void http_server_connection_request_callback(
        /* 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 @@ static void http_server_connection_request_callback(
        /* 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 @@ http_server_connection_handle_request(struct http_server_connection *conn,
        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 @@ static void http_server_connection_input(struct connection *_conn)
                        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:
index 21100df5c07baeb2cf555df7574b4e1275f6853d..5f36bb13be4a40ab8e5a3a044e0c65fa9157b46c 100644 (file)
@@ -174,7 +174,8 @@ void http_server_request_finished(struct http_server_request *req)
        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 @@ void http_server_request_fail(struct http_server_request *req,
        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);
+}
index 620afe07c6fb33a34bf109f7d69b48caf600b4ee..191ca280c902735d80f244cbc3ae506acd8d1382 100644 (file)
@@ -142,13 +142,20 @@ static void http_server_response_do_submit(struct http_server_response *resp,
        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, 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, close);
+       http_server_response_do_submit(resp, TRUE);
 }
 
 void http_server_response_submit_tunnel(struct http_server_response *resp,
index c58086941872e28dfae76ffe515a5962b04ca8c9..9acc4553f260a1925c30a3013f796bcea8390a3b 100644 (file)
@@ -65,8 +65,13 @@ http_server_connection_get_stats(struct http_server_connection *conn);
 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 @@ void http_server_response_set_payload(struct http_server_response *resp,
                                     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);