From 25001837e9f6a3727394f2f639aff7a0151bbbda Mon Sep 17 00:00:00 2001 From: David Shaw Date: Fri, 11 Feb 2005 18:05:13 +0000 Subject: [PATCH] * curl-shim.h, curl-shim.c: New. This is code to fake the curl API in terms of the current HTTP iobuf API. * gpgkeys_curl.c [FAKE_CURL], Makefile.am: If FAKE_CURL is set, link with the iobuf code rather than libcurl. --- keyserver/ChangeLog | 8 ++ keyserver/Makefile.am | 7 ++ keyserver/curl-shim.c | 153 +++++++++++++++++++++++++++++++++++++++ keyserver/curl-shim.h | 71 ++++++++++++++++++ keyserver/gpgkeys_curl.c | 4 + 5 files changed, 243 insertions(+) create mode 100644 keyserver/curl-shim.c create mode 100644 keyserver/curl-shim.h diff --git a/keyserver/ChangeLog b/keyserver/ChangeLog index 4149e71f9..0a0ab1ac5 100644 --- a/keyserver/ChangeLog +++ b/keyserver/ChangeLog @@ -1,3 +1,11 @@ +2005-02-11 David Shaw + + * curl-shim.h, curl-shim.c: New. This is code to fake the curl + API in terms of the current HTTP iobuf API. + + * gpgkeys_curl.c [FAKE_CURL], Makefile.am: If FAKE_CURL is set, + link with the iobuf code rather than libcurl. + 2005-02-05 David Shaw * gpgkeys_finger.c (main), gpgkeys_hkp.c (main): Fix --version diff --git a/keyserver/Makefile.am b/keyserver/Makefile.am index 68c7cd832..0b045e42d 100644 --- a/keyserver/Makefile.am +++ b/keyserver/Makefile.am @@ -39,5 +39,12 @@ gpgkeys_ldap_LDADD = ../util/libutil.a @LDAPLIBS@ @NETLIBS@ $(other_libs) @GETOP gpgkeys_hkp_LDADD = ../util/libutil.a @NETLIBS@ @SRVLIBS@ $(other_libs) @GETOPT@ @W32LIBS@ gpgkeys_http_LDADD = ../util/libutil.a @NETLIBS@ @SRVLIBS@ $(other_libs) @GETOPT@ @W32LIBS@ gpgkeys_finger_LDADD = ../util/libutil.a @NETLIBS@ $(other_libs) @GETOPT@ @W32LIBS@ + +if FAKE_CURL +gpgkeys_curl_SOURCES += curl-shim.c curl-shim.h +gpgkeys_curl_CPPFLAGS = -DFAKE_CURL +gpgkeys_curl_LDADD = ../util/libutil.a @NETLIBS@ @SRVLIBS@ $(other_libs) @GETOPT@ @W32LIBS@ +else gpgkeys_curl_CPPFLAGS = @LIBCURL_CPPFLAGS@ gpgkeys_curl_LDADD = @LIBCURL@ @GETOPT@ +endif diff --git a/keyserver/curl-shim.c b/keyserver/curl-shim.c new file mode 100644 index 000000000..623d685f7 --- /dev/null +++ b/keyserver/curl-shim.c @@ -0,0 +1,153 @@ +/* curl-shim.c - Implement a small subset of the curl API in terms of + * the iobuf HTTP API + * + * Copyright (C) 2005 Free Software Foundation, Inc. + * + * This file is part of GnuPG. + * + * GnuPG is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * GnuPG is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include +#include +#include +#include +#include "http.h" +#include "util.h" +#include "curl-shim.h" + +static CURLcode handle_error(CURL *curl,CURLcode err,const char *str) +{ + if(curl->errorbuffer) + { + switch(err) + { + case CURLE_OK: + strcpy(curl->errorbuffer,"okay"); + break; + + case CURLE_COULDNT_CONNECT: + strcpy(curl->errorbuffer,"couldn't connect"); + break; + + case CURLE_WRITE_ERROR: + strcpy(curl->errorbuffer,"write error"); + break; + + default: + strcpy(curl->errorbuffer,"generic error"); + break; + } + + if(str && (strlen(curl->errorbuffer)+2+strlen(str)+1)<=CURL_ERROR_SIZE) + { + strcat(curl->errorbuffer,": "); + strcat(curl->errorbuffer,str); + } + } + + return err; +} + +CURLcode curl_global_init(long flags) +{ + return CURLE_OK; +} + +void curl_global_cleanup(void) {} + +CURL *curl_easy_init(void) +{ + return calloc(1,sizeof(CURL)); +} + +void curl_easy_cleanup(CURL *curl) +{ + free(curl); +} + +CURLcode curl_easy_setopt(CURL *curl,CURLoption option,...) +{ + va_list ap; + + va_start(ap,option); + + switch(option) + { + case CURLOPT_URL: + curl->url=va_arg(ap,char *); + break; + case CURLOPT_WRITEFUNCTION: + curl->writer=va_arg(ap,write_func); + break; + case CURLOPT_FILE: + curl->file=va_arg(ap,void *); + break; + case CURLOPT_ERRORBUFFER: + curl->errorbuffer=va_arg(ap,char *); + break; + case CURLOPT_PROXY: + curl->proxy=va_arg(ap,char *); + break; + default: + /* We ignore the huge majority of curl options */ + break; + } + + return handle_error(curl,CURLE_OK,NULL); +} + +CURLcode curl_easy_perform(CURL *curl) +{ + int rc; + CURLcode err=CURLE_OK; + const char *errstr=NULL; + + rc=http_open_document(&curl->hd,curl->url,0,curl->proxy); + if(rc!=0) + { + if(rc==G10ERR_NETWORK) + errstr=strerror(errno); + else + errstr=g10_errstr(rc); + + err=CURLE_COULDNT_CONNECT; + } + else + { + size_t maxlen=1024,buflen,len; + byte *line=NULL; + + while((len=iobuf_read_line(curl->hd.fp_read,&line,&buflen,&maxlen))) + { + maxlen=1024; + size_t ret; + + ret=(curl->writer)(line,len,1,curl->file); + if(ret!=len) + { + err=CURLE_WRITE_ERROR; + break; + } + } + + m_free(line); + http_close(&curl->hd); + } + + return handle_error(curl,err,errstr); +} diff --git a/keyserver/curl-shim.h b/keyserver/curl-shim.h new file mode 100644 index 000000000..eb91af33d --- /dev/null +++ b/keyserver/curl-shim.h @@ -0,0 +1,71 @@ +/* curl-shim.h + * Copyright (C) 2005 Free Software Foundation, Inc. + * + * This file is part of GNUPG. + * + * GNUPG is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * GNUPG is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef _CURL_SHIM_H_ +#define _CURL_SHIM_H_ + +#include "http.h" + +typedef enum + { + CURLE_OK=0, + CURLE_FTP_COULDNT_RETR_FILE, + CURLE_COULDNT_CONNECT, + CURLE_WRITE_ERROR + } CURLcode; + +typedef enum + { + CURLOPT_URL, + CURLOPT_WRITEFUNCTION, + CURLOPT_FILE, + CURLOPT_ERRORBUFFER, + CURLOPT_FOLLOWLOCATION, + CURLOPT_MAXREDIRS, + CURLOPT_STDERR, + CURLOPT_VERBOSE, + CURLOPT_SSL_VERIFYPEER, + CURLOPT_PROXY + } CURLoption; + +typedef size_t (*write_func)(char *buffer,size_t size, + size_t nitems,void *outstream); + +typedef struct +{ + char *url; + char *errorbuffer; + char *proxy; + write_func writer; + void *file; + struct http_context hd; +} CURL; + +#define CURL_ERROR_SIZE 256 +#define CURL_GLOBAL_DEFAULT 0 + +CURLcode curl_global_init(long flags); +void curl_global_cleanup(void); +CURL *curl_easy_init(void); +CURLcode curl_easy_setopt(CURL *curl,CURLoption option,...); +CURLcode curl_easy_perform(CURL *curl); +void curl_easy_cleanup(CURL *curl); + +#endif /* !_CURL_SHIM_H_ */ diff --git a/keyserver/gpgkeys_curl.c b/keyserver/gpgkeys_curl.c index 71ee97260..7c3dcb3c7 100644 --- a/keyserver/gpgkeys_curl.c +++ b/keyserver/gpgkeys_curl.c @@ -27,7 +27,11 @@ #ifdef HAVE_GETOPT_H #include #endif +#ifdef FAKE_CURL +#include "curl-shim.h" +#else #include +#endif #include "keyserver.h" #include "ksutil.h"