}
static bool
-http_client_connection_return_response(struct http_client_connection *conn,
- struct http_client_request *req, struct http_response *response)
+http_client_connection_return_response(struct http_client_request *req,
+ struct http_response *response)
{
+ struct http_client_connection *conn = req->conn;
struct istream *payload;
bool retrying, ret;
conn->in_req_callback = TRUE;
http_client_connection_ref(conn);
retrying = !http_client_request_callback(req, response);
- http_client_connection_unref(&conn);
- if (conn == NULL) {
- req->conn = NULL;
+ if (!http_client_connection_unref(&req->conn)) {
/* the callback managed to get this connection destroyed */
if (!retrying)
http_client_request_finish(&req);
if (!handled) {
/* response for application */
- if (!http_client_connection_return_response(conn, req, &response))
+ i_assert(req->conn == conn);
+ if (!http_client_connection_return_response(req, &response))
return;
}
}
response.status = 200;
response.reason = "OK";
- (void)http_client_connection_return_response(conn, req, &response);
+ (void)http_client_connection_return_response(req, &response);
http_client_request_unref(&req);
return;
}
timeout_remove(&conn->to_response);
}
-void http_client_connection_unref(struct http_client_connection **_conn)
+bool http_client_connection_unref(struct http_client_connection **_conn)
{
struct http_client_connection *conn = *_conn;
struct http_client_connection *const *conn_idx;
i_assert(conn->refcount > 0);
+ *_conn = NULL;
+
if (--conn->refcount > 0)
- return;
+ return TRUE;
http_client_connection_debug(conn, "Connection destroy");
if (conn->connect_succeeded)
http_client_peer_connection_lost(peer);
i_free(conn);
- *_conn = NULL;
+ return FALSE;
}
void http_client_connection_close(struct http_client_connection **_conn)
struct http_client_connection *
http_client_connection_create(struct http_client_peer *peer);
void http_client_connection_ref(struct http_client_connection *conn);
-void http_client_connection_unref(struct http_client_connection **_conn);
+/* Returns FALSE if unrefing destroyed the connection entirely */
+bool http_client_connection_unref(struct http_client_connection **_conn);
void http_client_connection_close(struct http_client_connection **_conn);
int http_client_connection_output(struct http_client_connection *conn);
void http_client_connection_start_request_timeout(