]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
plugins: fts-solr: solr-connection - Move lookup context data to separate struct.
authorStephan Bosch <stephan.bosch@open-xchange.com>
Tue, 8 Oct 2019 16:56:58 +0000 (18:56 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Thu, 9 Jan 2020 12:52:43 +0000 (12:52 +0000)
src/plugins/fts-solr/solr-connection.c

index 99e579855c08e68f8c517c62a848ce23d3486caa..6a2f85c505dd585060f8c22eb1fe145ec8eef9ff 100644 (file)
 
 #include <expat.h>
 
+struct solr_lookup_context {
+       struct solr_connection *conn;
+
+       struct istream *payload;
+       struct io *io;
+
+       int request_status;
+};
+
 struct solr_connection_post {
        struct solr_connection *conn;
 
@@ -34,9 +43,6 @@ struct solr_connection {
 
        int request_status;
 
-       struct istream *payload;
-       struct io *io;
-
        bool debug:1;
        bool posting:1;
        bool xml_failed:1;
@@ -126,63 +132,67 @@ void solr_connection_deinit(struct solr_connection **_conn)
        i_free(conn);
 }
 
-static void solr_connection_payload_input(struct solr_connection *conn)
+static void solr_connection_payload_input(struct solr_lookup_context *lctx)
 {
        const unsigned char *data;
        size_t size;
        int ret;
 
        /* read payload */
-       while ((ret = i_stream_read_more(conn->payload, &data, &size)) > 0) {
-               (void)solr_xml_parse(conn, data, size, FALSE);
-               i_stream_skip(conn->payload, size);
+       while ((ret = i_stream_read_more(lctx->payload, &data, &size)) > 0) {
+               (void)solr_xml_parse(lctx->conn, data, size, FALSE);
+               i_stream_skip(lctx->payload, size);
        }
 
        if (ret == 0) {
                /* we will be called again for more data */
        } else {
-               if (conn->payload->stream_errno != 0) {
+               if (lctx->payload->stream_errno != 0) {
                        i_error("fts_solr: "
                                "failed to read payload from HTTP server: %m");
-                       conn->request_status = -1;
+                       lctx->request_status = -1;
                }
-               io_remove(&conn->io);
-               i_stream_unref(&conn->payload);
+               io_remove(&lctx->io);
+               i_stream_unref(&lctx->payload);
        }
 }
 
 static void
 solr_connection_select_response(const struct http_response *response,
-                               struct solr_connection *conn)
+                               struct solr_lookup_context *lctx)
 {
        if (response->status / 100 != 2) {
                i_error("fts_solr: Lookup failed: %s",
                        http_response_get_message(response));
-               conn->request_status = -1;
+               lctx->request_status = -1;
                return;
        }
 
        if (response->payload == NULL) {
                i_error("fts_solr: Lookup failed: Empty response payload");
-               conn->request_status = -1;
+               lctx->request_status = -1;
                return;
        }
 
        i_stream_ref(response->payload);
-       conn->payload = response->payload;
-       conn->io = io_add_istream(response->payload,
-                                 solr_connection_payload_input, conn);
-       solr_connection_payload_input(conn);
+       lctx->payload = response->payload;
+       lctx->io = io_add_istream(response->payload,
+                                 solr_connection_payload_input, lctx);
+       solr_connection_payload_input(lctx);
 }
 
 int solr_connection_select(struct solr_connection *conn, const char *query,
                           pool_t pool, struct solr_result ***box_results_r)
 {
        struct solr_lookup_xml_context solr_lookup_context;
+       struct solr_lookup_context lctx;
        struct http_client_request *http_req;
        const char *url;
        int parse_ret;
 
+       i_zero(&lctx);
+       lctx.conn = conn;
+
        i_zero(&solr_lookup_context);
        solr_lookup_context.result_pool = pool;
        hash_table_create(&solr_lookup_context.mailboxes, default_pool, 0,
@@ -201,7 +211,8 @@ int solr_connection_select(struct solr_connection *conn, const char *query,
 
        http_req = http_client_request(solr_http_client, "GET",
                                       conn->http_host, url,
-                                      solr_connection_select_response, conn);
+                                      solr_connection_select_response,
+                                      &lctx);
        if (conn->http_user != NULL) {
                http_client_request_set_auth_simple(
                        http_req, conn->http_user, conn->http_password);
@@ -210,10 +221,10 @@ int solr_connection_select(struct solr_connection *conn, const char *query,
        http_client_request_set_ssl(http_req, conn->http_ssl);
        http_client_request_submit(http_req);
 
-       conn->request_status = 0;
+       lctx.request_status = 0;
        http_client_wait(solr_http_client);
 
-       if (conn->request_status < 0 ||
+       if (lctx.request_status < 0 ||
            solr_lookup_context.content_state == SOLR_XML_CONTENT_STATE_ERROR)
                return -1;