msg->code = parser->status_code;
rspamd_http_connection_ref (conn);
ret = conn->finish_handler (conn, msg);
- conn->finished = TRUE;
+
+ if (conn->opts & RSPAMD_HTTP_CLIENT_KEEP_ALIVE) {
+ rspamd_http_context_push_keepalive (conn->priv->ctx, conn,
+ msg, conn->priv->ctx->ev_base);
+ }
+ else {
+ conn->finished = TRUE;
+ }
+
rspamd_http_connection_unref (conn);
return ret;
msg->code = parser->status_code;
rspamd_http_connection_ref (conn);
ret = conn->finish_handler (conn, msg);
- conn->finished = TRUE;
+
+ if (conn->opts & RSPAMD_HTTP_CLIENT_KEEP_ALIVE) {
+ rspamd_http_context_push_keepalive (conn->priv->ctx, conn,
+ msg, conn->priv->ctx->ev_base);
+ }
+ else {
+ conn->finished = TRUE;
+ }
+
rspamd_http_connection_unref (conn);
return ret;
rspamd_http_connection_ref (conn);
ret = conn->finish_handler (conn, priv->msg);
- conn->finished = TRUE;
+
+ if (conn->opts & RSPAMD_HTTP_CLIENT_KEEP_ALIVE) {
+ rspamd_http_context_push_keepalive (conn->priv->ctx, conn,
+ priv->msg, conn->priv->ctx->ev_base);
+ }
+ else {
+ conn->finished = TRUE;
+ }
+
rspamd_http_connection_unref (conn);
}
return conn;
}
+struct rspamd_http_connection *
+rspamd_http_connection_new_keepalive (struct rspamd_http_context *ctx,
+ rspamd_http_body_handler_t body_handler,
+ rspamd_http_error_handler_t error_handler,
+ rspamd_http_finish_handler_t finish_handler,
+ rspamd_inet_addr_t *addr,
+ const gchar *host)
+{
+ struct rspamd_http_connection *conn;
+ gint fd;
+
+ if (error_handler == NULL || finish_handler == NULL) {
+ return NULL;
+ }
+
+ conn = rspamd_http_context_check_keepalive (ctx, addr, host);
+
+ if (conn) {
+ return conn;
+ }
+
+ fd = rspamd_inet_address_connect (addr, SOCK_STREAM, TRUE);
+
+ if (fd == -1) {
+ msg_info ("cannot connect to %s: %s", rspamd_inet_address_to_string (addr),
+ host);
+ return NULL;
+ }
+
+ conn = rspamd_http_connection_new (ctx, fd, body_handler, error_handler,
+ finish_handler,
+ RSPAMD_HTTP_CLIENT_SIMPLE|RSPAMD_HTTP_CLIENT_KEEP_ALIVE,
+ RSPAMD_HTTP_CLIENT);
+
+ if (conn) {
+ rspamd_http_context_prepare_keepalive (ctx, conn, addr, host);
+ }
+
+ return conn;
+}
+
void
rspamd_http_connection_reset (struct rspamd_http_connection *conn)
{
g_free (priv);
}
+ if (conn->opts & RSPAMD_HTTP_CLIENT_KEEP_ALIVE) {
+ /* Fd is owned by a connection */
+ close (conn->fd);
+ }
+
g_free (conn);
}