]> 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)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 26 Feb 2018 08:47:13 +0000 (10:47 +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 15783dc10e439af9212d057e9b4f55b42d86593c..247b3a4113f86fff9eba01f297f096d8083e0c82 100644 (file)
@@ -817,6 +817,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);
 }
@@ -1310,6 +1311,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) {
@@ -1404,7 +1406,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);
@@ -1436,6 +1440,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)
@@ -1484,6 +1490,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) {
@@ -1586,6 +1594,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);
 }