970c22f970
The ability to do HTTP requests over a UNIX domain socket has been requested before, in Apr 2008 [0][1] and Sep 2010 [2]. While a discussion happened, no patch seems to get through. I decided to give it a go since I need to test a nginx HTTP server which listens on a UNIX domain socket. One patch [3] seems to make it possible to use the CURLOPT_OPENSOCKETFUNCTION function to gain a UNIX domain socket. Another person wrote a Go program which can do HTTP over a UNIX socket for Docker[4] which uses a special URL scheme (though the name contains cURL, it has no relation to the cURL library). This patch considers support for UNIX domain sockets at the same level as HTTP proxies / IPv6, it acts as an intermediate socket provider and not as a separate protocol. Since this feature affects network operations, a new feature flag was added ("unix-sockets") with a corresponding CURL_VERSION_UNIX_SOCKETS macro. A new CURLOPT_UNIX_SOCKET_PATH option is added and documented. This option enables UNIX domain sockets support for all requests on the handle (replacing IP sockets and skipping proxies). A new configure option (--enable-unix-sockets) and CMake option (ENABLE_UNIX_SOCKETS) can disable this optional feature. Note that I deliberately did not mark this feature as advanced, this is a feature/component that should easily be available. [0]: http://curl.haxx.se/mail/lib-2008-04/0279.html [1]: http://daniel.haxx.se/blog/2008/04/14/http-over-unix-domain-sockets/ [2]: http://sourceforge.net/p/curl/feature-requests/53/ [3]: http://curl.haxx.se/mail/lib-2008-04/0361.html [4]: https://github.com/Soulou/curl-unix-socket Signed-off-by: Peter Wu <peter@lekensteyn.nl>
102 lines
3.0 KiB
C
102 lines
3.0 KiB
C
#ifndef HEADER_CURL_ADDRINFO_H
|
|
#define HEADER_CURL_ADDRINFO_H
|
|
/***************************************************************************
|
|
* _ _ ____ _
|
|
* Project ___| | | | _ \| |
|
|
* / __| | | | |_) | |
|
|
* | (__| |_| | _ <| |___
|
|
* \___|\___/|_| \_\_____|
|
|
*
|
|
* Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
|
*
|
|
* This software is licensed as described in the file COPYING, which
|
|
* you should have received as part of this distribution. The terms
|
|
* are also available at http://curl.haxx.se/docs/copyright.html.
|
|
*
|
|
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
|
* copies of the Software, and permit persons to whom the Software is
|
|
* furnished to do so, under the terms of the COPYING file.
|
|
*
|
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
* KIND, either express or implied.
|
|
*
|
|
***************************************************************************/
|
|
|
|
#include "curl_setup.h"
|
|
|
|
#ifdef HAVE_NETINET_IN_H
|
|
# include <netinet/in.h>
|
|
#endif
|
|
#ifdef HAVE_NETDB_H
|
|
# include <netdb.h>
|
|
#endif
|
|
#ifdef HAVE_ARPA_INET_H
|
|
# include <arpa/inet.h>
|
|
#endif
|
|
|
|
#ifdef __VMS
|
|
# include <in.h>
|
|
# include <inet.h>
|
|
# include <stdlib.h>
|
|
#endif
|
|
|
|
|
|
/*
|
|
* Curl_addrinfo is our internal struct definition that we use to allow
|
|
* consistent internal handling of this data. We use this even when the
|
|
* system provides an addrinfo structure definition. And we use this for
|
|
* all sorts of IPv4 and IPV6 builds.
|
|
*/
|
|
|
|
struct Curl_addrinfo {
|
|
int ai_flags;
|
|
int ai_family;
|
|
int ai_socktype;
|
|
int ai_protocol;
|
|
curl_socklen_t ai_addrlen; /* Follow rfc3493 struct addrinfo */
|
|
char *ai_canonname;
|
|
struct sockaddr *ai_addr;
|
|
struct Curl_addrinfo *ai_next;
|
|
};
|
|
typedef struct Curl_addrinfo Curl_addrinfo;
|
|
|
|
void
|
|
Curl_freeaddrinfo(Curl_addrinfo *cahead);
|
|
|
|
#ifdef HAVE_GETADDRINFO
|
|
int
|
|
Curl_getaddrinfo_ex(const char *nodename,
|
|
const char *servname,
|
|
const struct addrinfo *hints,
|
|
Curl_addrinfo **result);
|
|
#endif
|
|
|
|
Curl_addrinfo *
|
|
Curl_he2ai(const struct hostent *he, int port);
|
|
|
|
Curl_addrinfo *
|
|
Curl_ip2addr(int af, const void *inaddr, const char *hostname, int port);
|
|
|
|
Curl_addrinfo *Curl_str2addr(char *dotted, int port);
|
|
|
|
#ifdef USE_UNIX_SOCKETS
|
|
Curl_addrinfo *Curl_unix2addr(const char *path);
|
|
#endif
|
|
|
|
#if defined(CURLDEBUG) && defined(HAVE_FREEADDRINFO)
|
|
void
|
|
curl_dofreeaddrinfo(struct addrinfo *freethis,
|
|
int line, const char *source);
|
|
#endif
|
|
|
|
#if defined(CURLDEBUG) && defined(HAVE_GETADDRINFO)
|
|
int
|
|
curl_dogetaddrinfo(const char *hostname,
|
|
const char *service,
|
|
const struct addrinfo *hints,
|
|
struct addrinfo **result,
|
|
int line, const char *source);
|
|
#endif
|
|
|
|
#endif /* HEADER_CURL_ADDRINFO_H */
|