dovecot-2.2: fts-solr: Use built-in lib-http instead of libcurl....

dovecot at dovecot.org dovecot at dovecot.org
Mon Feb 11 01:47:17 EET 2013


details:   http://hg.dovecot.org/dovecot-2.2/rev/b9b8286fd9fd
changeset: 15755:b9b8286fd9fd
user:      Stephan Bosch <stephan at rename-it.nl>
date:      Mon Feb 11 01:43:25 2013 +0200
description:
fts-solr: Use built-in lib-http instead of libcurl. Removed libcurl dependency.

diffstat:

 configure.ac                                |   30 +-
 src/plugins/fts-solr/Makefile.am            |    6 +-
 src/plugins/fts-solr/fts-backend-solr-old.c |   15 +-
 src/plugins/fts-solr/fts-backend-solr.c     |   13 +-
 src/plugins/fts-solr/solr-connection.c      |  417 ++++++++++++---------------
 src/plugins/fts-solr/solr-connection.h      |    8 +-
 6 files changed, 220 insertions(+), 269 deletions(-)

diffs (truncated from 738 to 300 lines):

diff -r f6a8f0522634 -r b9b8286fd9fd configure.ac
--- a/configure.ac	Mon Feb 11 01:22:51 2013 +0200
+++ b/configure.ac	Mon Feb 11 01:43:25 2013 +0200
@@ -2642,33 +2642,21 @@
 
 have_solr=no
 if test "$want_solr" != "no"; then
-  AC_CHECK_PROG(CURLCONFIG, curl-config, curl-config, NO)
-  if test $CURLCONFIG != NO; then
-    CURL_CFLAGS=`$CURLCONFIG --cflags`
-    CURL_LIBS=`$CURLCONFIG --libs`
-    
-    dnl libcurl found, also need libexpat
-    AC_CHECK_LIB(expat, XML_Parse, [
-      AC_CHECK_HEADER(expat.h, [
-        AC_SUBST(CURL_CFLAGS)
-        AC_SUBST(CURL_LIBS)
-	have_solr=yes
-        fts="$fts solr"
-      ], [
-	if test $want_solr = yes; then
-	  AC_ERROR([Can't build with Solr support: expat.h not found])
-	fi
-      ])
+  dnl need libexpat
+  AC_CHECK_LIB(expat, XML_Parse, [
+    AC_CHECK_HEADER(expat.h, [
+      have_solr=yes
+      fts="$fts solr"
     ], [
       if test $want_solr = yes; then
-	AC_ERROR([Can't build with Solr support: libexpat not found])
+        AC_ERROR([Can't build with Solr support: expat.h not found])
       fi
     ])
-  else
+  ], [
     if test $want_solr = yes; then
-      AC_ERROR([Can't build with Solr support: curl-config not found])
+      AC_ERROR([Can't build with Solr support: libexpat not found])
     fi
-  fi
+  ])
 fi
 AM_CONDITIONAL(BUILD_SOLR, test "$have_solr" = "yes")
 
diff -r f6a8f0522634 -r b9b8286fd9fd src/plugins/fts-solr/Makefile.am
--- a/src/plugins/fts-solr/Makefile.am	Mon Feb 11 01:22:51 2013 +0200
+++ b/src/plugins/fts-solr/Makefile.am	Mon Feb 11 01:43:25 2013 +0200
@@ -1,11 +1,11 @@
 AM_CPPFLAGS = \
 	-I$(top_srcdir)/src/lib \
+	-I$(top_srcdir)/src/lib-http \
 	-I$(top_srcdir)/src/lib-mail \
 	-I$(top_srcdir)/src/lib-imap \
 	-I$(top_srcdir)/src/lib-index \
 	-I$(top_srcdir)/src/lib-storage \
-	-I$(top_srcdir)/src/plugins/fts \
-	$(CURL_CFLAGS)
+	-I$(top_srcdir)/src/plugins/fts
 
 NOPLUGIN_LDFLAGS =
 lib21_fts_solr_plugin_la_LDFLAGS = -module -avoid-version
@@ -19,7 +19,7 @@
 
 lib21_fts_solr_plugin_la_LIBADD = \
 	$(fts_plugin_dep) \
-	$(CURL_LIBS) -lexpat
+	-lexpat
 
 lib21_fts_solr_plugin_la_SOURCES = \
 	fts-backend-solr.c \
diff -r f6a8f0522634 -r b9b8286fd9fd src/plugins/fts-solr/fts-backend-solr-old.c
--- a/src/plugins/fts-solr/fts-backend-solr-old.c	Mon Feb 11 01:22:51 2013 +0200
+++ b/src/plugins/fts-solr/fts-backend-solr-old.c	Mon Feb 11 01:43:25 2013 +0200
@@ -6,6 +6,7 @@
 #include "hash.h"
 #include "strescape.h"
 #include "unichar.h"
+#include "http-url.h"
 #include "imap-utf7.h"
 #include "mail-storage-private.h"
 #include "mailbox-list-private.h"
@@ -149,7 +150,7 @@
 static void solr_quote_http(string_t *dest, const char *str)
 {
 	str_append(dest, "%22");
-	solr_connection_http_escape(solr_conn, dest, str);
+	http_url_escape_param(dest, str);
 	str_append(dest, "%22");
 }
 
@@ -224,16 +225,18 @@
 }
 
 static int
-fts_backend_solr_init(struct fts_backend *_backend,
-		      const char **error_r ATTR_UNUSED)
+fts_backend_solr_init(struct fts_backend *_backend, const char **error_r)
 {
 	struct solr_fts_backend *backend = (struct solr_fts_backend *)_backend;
 	struct fts_solr_user *fuser = FTS_SOLR_USER_CONTEXT(_backend->ns->user);
 	const struct fts_solr_settings *set = &fuser->set;
 	const char *str;
 
-	if (solr_conn == NULL)
-		solr_conn = solr_connection_init(set->url, set->debug);
+	if (solr_conn == NULL) {
+		if (solr_connection_init(set->url, set->debug,
+					 &solr_conn, error_r) < 0)
+			return -1;
+	}
 
 	str = solr_escape_id_str(_backend->ns->user->username);
 	backend->id_username = i_strdup(str);
@@ -278,7 +281,7 @@
 
 	tmp = t_str_new(64);
 	solr_add_ns_query(tmp, backend, ns, FALSE);
-	solr_connection_http_escape(solr_conn, str, str_c(tmp));
+	http_url_escape_param(str, str_c(tmp));
 }
 
 static int
diff -r f6a8f0522634 -r b9b8286fd9fd src/plugins/fts-solr/fts-backend-solr.c
--- a/src/plugins/fts-solr/fts-backend-solr.c	Mon Feb 11 01:22:51 2013 +0200
+++ b/src/plugins/fts-solr/fts-backend-solr.c	Mon Feb 11 01:43:25 2013 +0200
@@ -6,6 +6,7 @@
 #include "hash.h"
 #include "strescape.h"
 #include "unichar.h"
+#include "http-url.h"
 #include "mail-storage-private.h"
 #include "mailbox-list-private.h"
 #include "mail-search.h"
@@ -135,7 +136,7 @@
 static void solr_quote_http(string_t *dest, const char *str)
 {
 	str_append(dest, "%22");
-	solr_connection_http_escape(solr_conn, dest, str);
+	http_url_escape_param(dest, str);
 	str_append(dest, "%22");
 }
 
@@ -149,14 +150,16 @@
 }
 
 static int
-fts_backend_solr_init(struct fts_backend *_backend,
-		      const char **error_r ATTR_UNUSED)
+fts_backend_solr_init(struct fts_backend *_backend, const char **error_r)
 {
 	struct fts_solr_user *fuser = FTS_SOLR_USER_CONTEXT(_backend->ns->user);
 	const struct fts_solr_settings *set = &fuser->set;
 
-	if (solr_conn == NULL)
-		solr_conn = solr_connection_init(set->url, set->debug);
+	if (solr_conn == NULL) {
+		if (solr_connection_init(set->url, set->debug,
+					 &solr_conn, error_r) < 0)
+			return -1;
+	}
 	return 0;
 }
 
diff -r f6a8f0522634 -r b9b8286fd9fd src/plugins/fts-solr/solr-connection.c
--- a/src/plugins/fts-solr/solr-connection.c	Mon Feb 11 01:22:51 2013 +0200
+++ b/src/plugins/fts-solr/solr-connection.c	Mon Feb 11 01:43:25 2013 +0200
@@ -1,15 +1,16 @@
 /* Copyright (c) 2006-2013 Dovecot authors, see the included COPYING file */
 
-/* curl: 7.16.0 curl_multi_timeout */
-
 #include "lib.h"
 #include "array.h"
 #include "hash.h"
 #include "str.h"
 #include "strescape.h"
+#include "ioloop.h"
+#include "istream.h"
+#include "http-url.h"
+#include "http-client.h"
 #include "solr-connection.h"
 
-#include <curl/curl.h>
 #include <expat.h>
 
 enum solr_xml_response_state {
@@ -46,44 +47,33 @@
 
 struct solr_connection_post {
 	struct solr_connection *conn;
-	const unsigned char *data;
-	size_t size, pos;
-	char *url;
+
+	struct http_client_request *http_req;
 
 	unsigned int failed:1;
 };
 
 struct solr_connection {
-	CURL *curl;
-	CURLM *curlm;
+	struct http_client *http_client;
 
-	char curl_errorbuf[CURL_ERROR_SIZE];
-	struct curl_slist *headers, *headers_post;
 	XML_Parser xml_parser;
 
-	char *url, *last_sent_url;
+	char *http_host;
+	in_port_t http_port;
+	char *http_base_url;
 	char *http_failure;
 
+	int request_status;
+
+	struct istream *payload;
+	struct io *io;
+
 	unsigned int debug:1;
 	unsigned int posting:1;
 	unsigned int xml_failed:1;
+	unsigned int http_ssl:1;
 };
 
-static size_t
-curl_output_func(void *data, size_t element_size, size_t nmemb, void *context)
-{
-	struct solr_connection_post *post = context;
-	size_t size = element_size * nmemb;
-
-	/* @UNSAFE */
-	if (size > post->size - post->pos)
-		size = post->size - post->pos;
-
-	memcpy(data, post->data + post->pos, size);
-	post->pos += size;
-	return size;
-}
-
 static int solr_xml_parse(struct solr_connection *conn,
 			  const void *data, size_t size, bool done)
 {
@@ -109,105 +99,57 @@
 	return 0;
 }
 
-static size_t
-curl_input_func(void *data, size_t element_size, size_t nmemb, void *context)
+int solr_connection_init(const char *url, bool debug,
+			 struct solr_connection **conn_r, const char **error_r)
 {
-	struct solr_connection *conn = context;
-	size_t size = element_size * nmemb;
+	struct http_client_settings http_set;
+	struct solr_connection *conn;
+	struct http_url *http_url;
+	const char *error;
 
-	(void)solr_xml_parse(conn, data, size, FALSE);
-	return size;
-}
-
-static size_t
-curl_header_func(void *data, size_t element_size, size_t nmemb, void *context)
-{
-	struct solr_connection *conn = context;
-	size_t size = element_size * nmemb;
-	const unsigned char *p;
-	size_t i;
-
-	if (conn->http_failure != NULL)
-		return size;
-
-	for (i = 0, p = data; i < size; i++) {
-		if (p[i] == ' ') {
-			i++;
-			break;
-		}
+	if (http_url_parse(url, NULL, 0, pool_datastack_create(),
+			   &http_url, &error) < 0) {
+		*error_r = t_strdup_printf(
+			"fts_solr: Failed to parse HTTP url: %s", error);
+		return -1;
 	}
-	if (i == size || p[i] < '0' || p[i] > '9')
-		i = 0;
-	conn->http_failure = i_strndup(p + i, size - i);
-	return size;
-}
-
-struct solr_connection *solr_connection_init(const char *url, bool debug)
-{
-	struct solr_connection *conn;
 
 	conn = i_new(struct solr_connection, 1);
-	conn->url = i_strdup(url);
+	conn->http_host = i_strdup(http_url->host_name);


More information about the dovecot-cvs mailing list