]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-http: client: Record last status code in the request object.
authorStephan Bosch <stephan.bosch@dovecot.fi>
Sun, 21 Jan 2018 15:19:41 +0000 (16:19 +0100)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Mon, 12 Mar 2018 09:07:37 +0000 (11:07 +0200)
src/lib-http/http-client-private.h
src/lib-http/http-client-request.c

index efb838382fc5abe2d55b55bbd27dc31434de744a..da822d667eb183a6aaadeaf5c54ba4cceac16ca4 100644 (file)
@@ -97,7 +97,9 @@ struct http_client_request {
        struct http_client_queue *queue;
        struct http_client_peer *peer;
        struct http_client_connection *conn;
+
        struct event *event;
+       unsigned int last_status;
 
        string_t *headers;
        time_t date;
index 646bfc33cd305f48cdff0350ec6caacb0e262956..ec7cbd120e5289f8e5bcef007945b76f4404f474 100644 (file)
@@ -818,6 +818,7 @@ static void http_client_request_do_submit(struct http_client_request *req)
 
        host = http_client_host_get(client, req->host_url);
        req->state = HTTP_REQUEST_STATE_QUEUED;
+       req->last_status = 0;
 
        http_client_host_submit_request(host, req);
 }
@@ -1311,6 +1312,7 @@ bool http_client_request_callback(struct http_client_request *req,
        unsigned int orig_attempts = req->attempts;
 
        req->state = HTTP_REQUEST_STATE_GOT_RESPONSE;
+       req->last_status = response->status;
 
        req->callback = NULL;
        if (callback != NULL) {
@@ -1403,7 +1405,9 @@ void http_client_request_error(struct http_client_request **_req,
 
        i_assert(req->delayed_error_status == 0);
        i_assert(req->state < HTTP_REQUEST_STATE_FINISHED);
+
        req->state = HTTP_REQUEST_STATE_ABORTED;
+       req->last_status = status;
 
        if (req->queue != NULL)
                http_client_queue_drop_request(req->queue, req);
@@ -1435,6 +1439,8 @@ void http_client_request_abort(struct http_client_request **_req)
 
        req->callback = NULL;
        req->state = HTTP_REQUEST_STATE_ABORTED;
+       if (req->last_status == 0)
+               req->last_status = HTTP_CLIENT_REQUEST_ERROR_ABORTED;
 
        /* release payload early (prevents server/client deadlock in proxy) */
        if (!sending && req->payload_input != NULL)
@@ -1483,6 +1489,8 @@ void http_client_request_redirect(struct http_client_request *req,
        i_assert(req->client != NULL);
        i_assert(!req->payload_wait);
 
+       req->last_status = status;
+
        /* parse URL */
        if (http_url_parse(location, NULL, 0,
                           pool_datastack_create(), &url, &error) < 0) {
@@ -1585,6 +1593,7 @@ void http_client_request_resubmit(struct http_client_request *req)
        req->peer = NULL;
        req->state = HTTP_REQUEST_STATE_QUEUED;
        req->redirects = 0;
+       req->last_status = 0;
        http_client_host_submit_request(req->host, req);
 }