X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Ftransport%2Fplugin_transport_http_common.h;h=8a32e17e4f1650c642446843cf83e237441e8e10;hb=547d531bb3088bf00a0ae5777fa09c7893b7b370;hp=0f83da6b3107b127b069aa63a78fdf9177f30d49;hpb=8c3ea6f58287d4c7382b31f116580898f30aa914;p=oweals%2Fgnunet.git diff --git a/src/transport/plugin_transport_http_common.h b/src/transport/plugin_transport_http_common.h index 0f83da6b3..8a32e17e4 100644 --- a/src/transport/plugin_transport_http_common.h +++ b/src/transport/plugin_transport_http_common.h @@ -1,6 +1,6 @@ /* This file is part of GNUnet - (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Christian Grothoff (and other contributing authors) + Copyright (C) 2002-2014 GNUnet e.V. GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -14,31 +14,115 @@ You should have received a copy of the GNU General Public License along with GNUnet; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ - /** * @file transport/plugin_transport_http_common.c * @brief functionality shared by http client and server transport service plugin * @author Matthias Wachs + * @author Christian Grothoff */ - #include "platform.h" #include "gnunet_common.h" +#include "gnunet_transport_plugin.h" +/** + * Timeout values for testing + */ #define TESTING GNUNET_NO #if TESTING -#define TIMEOUT_LOG GNUNET_ERROR_TYPE_ERROR -#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 15) -#define HTTP_NOT_VALIDATED_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5) +#define HTTP_SERVER_NOT_VALIDATED_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 3) +#define HTTP_CLIENT_NOT_VALIDATED_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 3) +#define HTTP_CLIENT_SESSION_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 7) +#define SERVER_SESSION_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 7) +#define TIMEOUT_LOG GNUNET_ERROR_TYPE_DEBUG + +#else + +#if BUILD_HTTPS +#define PROTOCOL "https" #else -#define HTTP_NOT_VALIDATED_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 15) +#define PROTOCOL "http" +#endif + +#define HTTP_SERVER_NOT_VALIDATED_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 15) +#define HTTP_CLIENT_NOT_VALIDATED_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 15) +#define HTTP_CLIENT_SESSION_TIMEOUT GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT +#define HTTP_SERVER_SESSION_TIMEOUT GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT #define TIMEOUT_LOG GNUNET_ERROR_TYPE_DEBUG -#define TIMEOUT GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT + #endif +#define HTTP_DEFAULT_PORT 80 +#define HTTPS_DEFAULT_PORT 443 + +/** + * Bits in the `options` field of HTTP addresses. + */ +enum HttpAddressOptions +{ + /** + * No bits set. + */ + HTTP_OPTIONS_NONE = 0, + + /** + * Verify X509 server certificate, it should be valid. + * (if this bit is not set, it is probably just self- + * signed and not expected to be verified). + */ + HTTP_OPTIONS_VERIFY_CERTIFICATE = 1, + + /** + * Enable TCP Stealth-style port knocking. + */ + HTTP_OPTIONS_TCP_STEALTH = 2 +}; + + +GNUNET_NETWORK_STRUCT_BEGIN + +/** + * HttpAddress + */ +struct HttpAddress +{ + /** + * Address options + * see `enum HttpAddressOptions` + */ + uint32_t options GNUNET_PACKED; + + /** + * Length of URL located after struct + */ + uint32_t urlen GNUNET_PACKED; +}; + +GNUNET_NETWORK_STRUCT_END + +/** + * Representation of HTTP URL split into its components. + */ +struct SplittedHTTPAddress +{ + char *protocol; + char *host; + char *path; + int port; +}; + + +/** + * Split an HTTP address into protocol, hostname, port + * and path components. + */ +struct SplittedHTTPAddress * +http_split_address (const char *addr); + + /** * Convert the transports address to a nice, human-readable * format. @@ -51,15 +135,18 @@ * @param numeric should (IP) addresses be displayed in numeric form? * @param timeout after how long should we give up? * @param asc function to call on each string - * @param asc_cls closure for asc + * @param asc_cls closure for @a asc */ void -http_common_plugin_address_pretty_printer (void *cls, const char *type, - const void *addr, size_t addrlen, - int numeric, - struct GNUNET_TIME_Relative timeout, - GNUNET_TRANSPORT_AddressStringCallback - asc, void *asc_cls); +http_common_plugin_address_pretty_printer (void *cls, + const char *type, + const void *addr, + size_t addrlen, + int numeric, + struct GNUNET_TIME_Relative timeout, + GNUNET_TRANSPORT_AddressStringCallback asc, + void *asc_cls); + /** * Function called for a quick conversion of the binary address to @@ -67,27 +154,28 @@ http_common_plugin_address_pretty_printer (void *cls, const char *type, * address and that the next call to this function is allowed * to override the address again. * - * @param cls closure + * @param plugin name of the plugin * @param addr binary address - * @param addrlen length of the address + * @param addrlen length of @a addr * @return string representing the same address */ const char * -http_common_plugin_address_to_string (void *cls, +http_common_plugin_address_to_string (const char *plugin, const void *addr, size_t addrlen); + /** * Function called to convert a string address to * a binary address. * - * @param cls closure ('struct Plugin*') + * @param cls closure (`struct Plugin*`) * @param addr string address * @param addrlen length of the address * @param buf location to store the buffer - * If the function returns GNUNET_SYSERR, its contents are undefined. + * If the function returns #GNUNET_SYSERR, its contents are undefined. * @param added length of created address - * @return GNUNET_OK on success, GNUNET_SYSERR on failure + * @return #GNUNET_OK on success, #GNUNET_SYSERR on failure */ int http_common_plugin_string_to_address (void *cls, @@ -101,15 +189,39 @@ http_common_plugin_string_to_address (void *cls, * Create a HTTP address from a socketaddr * * @param protocol protocol - * @param addr sockaddr * address - * @param addrlen length of the address + * @param addr `sockaddr *` address + * @param addrlen length of the @a addr * @return the string */ -char * +struct HttpAddress * http_common_address_from_socket (const char *protocol, const struct sockaddr *addr, socklen_t addrlen); + +/** + * Create a socketaddr from a HTTP address + * + * @param addr a `sockaddr *` address + * @param addrlen length of the @a addr + * @param res the result: + * #GNUNET_SYSERR, invalid input, + * #GNUNET_YES: could convert to ip, + * #GNUNET_NO: valid input but could not convert to ip (hostname?) + * @return the string + */ +struct sockaddr * +http_common_socket_from_address (const void *addr, + size_t addrlen, + int *res); + + +const char * +http_common_plugin_address_to_url (void *cls, + const void *addr, + size_t addrlen); + + /** * Get the length of an address * @@ -117,18 +229,35 @@ http_common_address_from_socket (const char *protocol, * @return the size */ size_t -http_common_address_get_size (void *addr); +http_common_address_get_size (const struct HttpAddress * addr); /** * Compare addr1 to addr2 * * @param addr1 address1 - * @param addrlen1 address 1 length + * @param addrlen1 length of @a address1 * @param addr2 address2 - * @param addrlen2 address 2 length - * @return GNUNET_YES if equal, GNUNET_NO else + * @param addrlen2 length of @a address2 + * @return #GNUNET_YES if equal, #GNUNET_NO else */ size_t -http_common_cmp_addresses (const void *addr1, size_t addrlen1, const void *addr2, size_t addrlen2); -/* end of plugin_transport_http_common.c */ +http_common_cmp_addresses (const void *addr1, + size_t addrlen1, + const void *addr2, + size_t addrlen2); + + +/** + * Function obtain the network type for an address. + * + * @param env the environment + * @param address the address + * @return the network type + */ +enum GNUNET_ATS_Network_Type +http_common_get_network_for_address (struct GNUNET_TRANSPORT_PluginEnvironment *env, + const struct GNUNET_HELLO_Address *address); + + +/* end of plugin_transport_http_common.h */