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