Make gnurl and curl mutually exclusive.
[oweals/gnunet.git] / src / transport / plugin_transport_http.h
index 11584553a339b1f659472a6a7770c81358428f73..b6ada8f86d68bdea13f3ba51862266b148f1c44a 100644 (file)
@@ -1,21 +1,21 @@
 /*
      This file is part of GNUnet
-     (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Christian Grothoff (and other contributing authors)
+     Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 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
-     by the Free Software Foundation; either version 3, or (at your
-     option) any later version.
+     GNUnet is free software: you can redistribute it and/or modify it
+     under the terms of the GNU Affero General Public License as published
+     by the Free Software Foundation, either version 3 of the License,
+     or (at your option) any later version.
 
      GNUnet 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.
+     Affero General Public License for more details.
+    
+     You should have received a copy of the GNU Affero General Public License
+     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-     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.
+     SPDX-License-Identifier: AGPL3.0-or-later
 */
 
 /**
@@ -23,6 +23,8 @@
  * @brief http transport service plugin
  * @author Matthias Wachs
  */
+#ifndef PLUGIN_TRANSPORT_HTTP_H
+#define PLUGIN_TRANSPORT_HTTP_H
 
 #include "platform.h"
 #include "gnunet_common.h"
 #include "gnunet_os_lib.h"
 #include "gnunet_nat_lib.h"
 #include "microhttpd.h"
-#include <curl/curl.h>
+/* Just included for the right curl.h */
+#include "gnunet_curl_lib.h"
 
 
-#define DEBUG_HTTP GNUNET_YES
-#define VERBOSE_SERVER GNUNET_YES
-#define VERBOSE_CLIENT GNUNET_YES
+#define DEBUG_HTTP GNUNET_EXTRA_LOGGING
+#define VERBOSE_SERVER GNUNET_EXTRA_LOGGING
+#define VERBOSE_CLIENT GNUNET_EXTRA_LOGGING
 #define VERBOSE_CURL GNUNET_NO
 
 #if BUILD_HTTPS
 #define OUTBOUND GNUNET_NO
 
 
-#define HTTP_NOT_VALIDATED_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 3)
+#define HTTP_NOT_VALIDATED_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 15)
 
 /**
  * Encapsulation of all of the state of the plugin.
  */
 struct Plugin
 {
-  /**
-   * General handles
-   * ---------------
-   */
-
   /**
    * Our environment.
    */
   struct GNUNET_TRANSPORT_PluginEnvironment *env;
 
   /**
-   * Linked list of open sessions.
+   * Head of linked list of open sessions.
    */
+  struct GNUNET_ATS_Session *head;
 
-  struct Session *head;
-
-  struct Session *tail;
+  /**
+   * Tail of linked list of open sessions.
+   */
+  struct GNUNET_ATS_Session *tail;
 
   /**
    * NAT handle & address management
@@ -90,36 +90,39 @@ struct Plugin
   struct GNUNET_NAT_Handle *nat;
 
   /**
-   * List of own addresses
+   * Our own IPv4 addresses DLL head
    */
+  struct HttpAddressWrapper *addr_head;
 
   /**
-   * IPv4 addresses DLL head
+   * Our own IPv4 addresses DLL tail
    */
-  struct IPv4HttpAddressWrapper *ipv4_addr_head;
+  struct HttpAddressWrapper *addr_tail;
 
   /**
-   * IPv4 addresses DLL tail
+   * External hostname the plugin can be connected to, can be different to
+   * the host's FQDN, used e.g. for reverse proxying
    */
-  struct IPv4HttpAddressWrapper *ipv4_addr_tail;
+  char *external_hostname;
 
   /**
-   * IPv6 addresses DLL head
+   * External hostname the plugin can be connected to, can be different to
+   * the host's FQDN, used e.g. for reverse proxying
    */
-  struct IPv6HttpAddressWrapper *ipv6_addr_head;
+  struct HttpAddress *ext_addr;
 
   /**
-   * IPv6 addresses DLL tail
+   * External address length
    */
-  struct IPv6HttpAddressWrapper *ipv6_addr_tail;
+  size_t ext_addr_len;
 
   /**
-   * Plugin configuration
-   * --------------------
+   * Task calling transport service about external address
    */
+  struct GNUNET_SCHEDULER_Task * notify_ext_task;
 
   /**
-   * Plugin name
+   * Plugin name.
    * Equals configuration section: transport-http, transport-https
    */
   char *name;
@@ -131,17 +134,20 @@ struct Plugin
   char *protocol;
 
   /**
-   * Use IPv4?
-   * GNUNET_YES or GNUNET_NO
+   * Use IPv4? #GNUNET_YES or #GNUNET_NO
    */
   int ipv4;
 
   /**
-   * Use IPv6?
-   * GNUNET_YES or GNUNET_NO
+   * Use IPv6? #GNUNET_YES or #GNUNET_NO
    */
   int ipv6;
 
+  /**
+   * Does plugin just use outbound connections and not accept inbound?
+   */
+  int client_only;
+
   /**
    * Port used
    */
@@ -154,9 +160,14 @@ struct Plugin
   int max_connections;
 
   /**
-   * Plugin HTTPS SSL/TLS options
-   * ----------------------------
+   * Number of outbound sessions
+   */
+  unsigned int outbound_sessions;
+
+  /**
+   * Number of inbound sessions
    */
+  unsigned int inbound_sessions;
 
   /**
    * libCurl TLS crypto init string, can be set to enhance performance
@@ -165,7 +176,6 @@ struct Plugin
    *
    * Use RC4-128 instead of AES:
    * NONE:+VERS-TLS1.0:+ARCFOUR-128:+SHA1:+RSA:+COMP-NULL
-   *
    */
   char *crypto_init;
 
@@ -179,11 +189,6 @@ struct Plugin
    */
   char *cert;
 
-  /**
-   * Plugin values
-   * -------------
-   */
-
   /**
    * Current number of establishes connections
    */
@@ -194,11 +199,6 @@ struct Plugin
    */
   uint32_t last_tag;
 
-  /**
-   * Server handles
-   * --------------
-   */
-
   /**
    * MHD IPv4 daemon
    */
@@ -207,7 +207,12 @@ struct Plugin
   /**
    * MHD IPv4 task
    */
-  GNUNET_SCHEDULER_TaskIdentifier server_v4_task;
+  struct GNUNET_SCHEDULER_Task * server_v4_task;
+
+  /**
+   * The IPv4 server is scheduled to run asap
+   */
+  int server_v4_immediately;
 
   /**
    * MHD IPv6 daemon
@@ -217,30 +222,36 @@ struct Plugin
   /**
    * MHD IPv4 task
    */
-  GNUNET_SCHEDULER_TaskIdentifier server_v6_task;
+  struct GNUNET_SCHEDULER_Task * server_v6_task;
+
+  /**
+   * The IPv6 server is scheduled to run asap
+   */
+  int server_v6_immediately;
 
   /**
    * IPv4 server socket to bind to
    */
-  struct sockaddr_in * server_addr_v4;
+  struct sockaddr_in *server_addr_v4;
 
   /**
    * IPv6 server socket to bind to
    */
-  struct sockaddr_in6 * server_addr_v6;
+  struct sockaddr_in6 *server_addr_v6;
 
   /**
-   * Server semi connections
+   * Head of server semi connections
    * A full session consists of 2 semi-connections: send and receive
    * If not both directions are established the server keeps this sessions here
    */
-  struct Session *server_semi_head;
-
-  struct Session *server_semi_tail;
+  struct GNUNET_ATS_Session *server_semi_head;
 
-  /*
-   * Client handles
+  /**
+   * Tail of server semi connections
+   * A full session consists of 2 semi-connections: send and receive
+   * If not both directions are established the server keeps this sessions here
    */
+  struct GNUNET_ATS_Session *server_semi_tail;
 
   /**
    * cURL Multihandle
@@ -250,25 +261,105 @@ struct Plugin
   /**
    * curl perform task
    */
-  GNUNET_SCHEDULER_TaskIdentifier client_perform_task;
+  struct GNUNET_SCHEDULER_Task * client_perform_task;
 
 };
 
+GNUNET_NETWORK_STRUCT_BEGIN
+
+/**
+ * HTTP addresses including a full URI
+ */
+struct HttpAddress
+{
+  /**
+   * Length of the address following in NBO
+   */
+  uint32_t addr_len GNUNET_PACKED;
+
+  /**
+   * Address following
+   */
+  void *addr GNUNET_PACKED;
+};
+
+/**
+ * IPv4 addresses
+ */
+struct IPv4HttpAddress
+{
+  /**
+   * IPv4 address, in network byte order.
+   */
+  uint32_t ipv4_addr GNUNET_PACKED;
+
+  /**
+   * Port number, in network byte order.
+   */
+  uint16_t u4_port GNUNET_PACKED;
+};
+
+/**
+ * IPv4 addresses
+ */
+struct IPv6HttpAddress
+{
+  /**
+   * IPv6 address.
+   */
+  struct in6_addr ipv6_addr GNUNET_PACKED;
+
+  /**
+   * Port number, in network byte order.
+   */
+  uint16_t u6_port GNUNET_PACKED;
+};
+GNUNET_NETWORK_STRUCT_END
+
+
+struct ServerRequest
+{
+  /**
+   * _RECV or _SEND
+   */
+  int direction;
+
+  /**
+   * Should this connection get disconnected? #GNUNET_YES / #GNUNET_NO
+   */
+  int disconnect;
+
+  /**
+   * The session this server connection belongs to
+   */
+  struct GNUNET_ATS_Session *session;
+
+  /**
+   * The MHD connection
+   */
+  struct MHD_Connection *mhd_conn;
+};
+
+
 /**
  * Session handle for connections.
  */
-struct Session
+struct GNUNET_ATS_Session
 {
+  /**
+   * To whom are we talking to
+   */
+  struct GNUNET_PeerIdentity target;
 
   /**
    * Stored in a linked list.
    */
-  struct Session *next;
+  struct GNUNET_ATS_Session *next;
 
   /**
    * Stored in a linked list.
    */
-  struct Session *prev;
+  struct GNUNET_ATS_Session *prev;
 
   /**
    * Pointer to the global plugin struct.
@@ -286,9 +377,9 @@ struct Session
   size_t addrlen;
 
   /**
-   * To whom are we talking to
+   * ATS network type in NBO
    */
-  struct GNUNET_PeerIdentity target;
+  uint32_t ats_address_network_type;
 
   /**
    * next pointer for double linked list
@@ -300,7 +391,6 @@ struct Session
    */
   struct HTTP_Message *msg_tail;
 
-
   /**
    * Message stream tokenizer for incoming data
    */
@@ -314,8 +404,8 @@ struct Session
 
   /**
    * Inbound or outbound connection
-   * Outbound: GNUNET_NO (client is used to send and receive)
-   * Inbound : GNUNET_YES (server is used to send and receive)
+   * Outbound: #GNUNET_NO (client is used to send and receive)
+   * Inbound : #GNUNET_YES (server is used to send and receive)
    */
   int inbound;
 
@@ -324,10 +414,6 @@ struct Session
    */
   uint32_t tag;
 
-  /**
-   * Client handles
-   */
-
   /**
    * Client send handle
    */
@@ -341,29 +427,31 @@ struct Session
   /**
    * Task to wake up client receive handle when receiving is allowed again
    */
-  GNUNET_SCHEDULER_TaskIdentifier recv_wakeup_task;
+  struct GNUNET_SCHEDULER_Task * recv_wakeup_task;
 
   /**
-   * Is client send handle paused since there are no data to send?
-   * GNUNET_YES/NO
+   * Session timeout task
    */
-  int client_put_paused;
+  struct GNUNET_SCHEDULER_Task * timeout_task;
 
   /**
-   * Server handles
+   * Is client send handle paused since there are no data to send?
+   * #GNUNET_YES or #GNUNET_NO
    */
+  int client_put_paused;
 
   /**
    * Client send handle
    */
-  void *server_recv;
+  struct ServerRequest *server_recv;
 
   /**
    * Client send handle
    */
-  void *server_send;
+  struct ServerRequest *server_send;
 };
 
+
 /**
  *  Message to send using http
  */
@@ -402,59 +490,90 @@ struct HTTP_Message
   GNUNET_TRANSPORT_TransmitContinuation transmit_cont;
 
   /**
-   * Closure for transmit_cont.
+   * Closure for @e transmit_cont.
    */
   void *transmit_cont_cls;
 };
 
+
+struct GNUNET_ATS_Session *
+create_session (struct Plugin *plugin,
+                const struct GNUNET_PeerIdentity *target,
+                const void *addr,
+                size_t addrlen);
+
+
+int
+exist_session (struct Plugin *plugin,
+               struct GNUNET_ATS_Session *s);
+
+
 void
-delete_session (struct Session *s);
+delete_session (struct GNUNET_ATS_Session *s);
+
+
+int
+exist_session (struct Plugin *plugin,
+               struct GNUNET_ATS_Session *s);
 
-struct Session *
-create_session (struct Plugin *plugin, const struct GNUNET_PeerIdentity *target,
-                const void *addr, size_t addrlen,
-                GNUNET_TRANSPORT_TransmitContinuation cont, void *cont_cls);
 
 struct GNUNET_TIME_Relative
-http_plugin_receive (void *cls, const struct GNUNET_PeerIdentity * peer,
-    const struct  GNUNET_MessageHeader * message,
-    struct Session * session,
-    const char *sender_address,
-    uint16_t sender_address_len);
+http_plugin_receive (void *cls,
+                     const struct GNUNET_PeerIdentity *peer,
+                     const struct GNUNET_MessageHeader *message,
+                     struct GNUNET_ATS_Session *session,
+                     const char *sender_address,
+                     uint16_t sender_address_len);
+
 
 const char *
-http_plugin_address_to_string (void *cls, const void *addr, size_t addrlen);
+http_plugin_address_to_string (void *cls,
+                               const void *addr,
+                               size_t addrlen);
+
 
 int
-client_disconnect (struct Session *s);
+client_disconnect (struct GNUNET_ATS_Session *s);
+
 
 int
-client_connect (struct Session *s);
+client_connect (struct GNUNET_ATS_Session *s);
+
 
 int
-client_send (struct Session *s, struct HTTP_Message *msg);
+client_send (struct GNUNET_ATS_Session *s, struct HTTP_Message *msg);
+
 
 int
 client_start (struct Plugin *plugin);
 
+
 void
 client_stop (struct Plugin *plugin);
 
+
 int
-server_disconnect (struct Session *s);
+server_disconnect (struct GNUNET_ATS_Session *s);
+
 
 int
-server_send (struct Session *s, struct HTTP_Message * msg);
+server_send (struct GNUNET_ATS_Session *s, struct HTTP_Message *msg);
+
 
 int
 server_start (struct Plugin *plugin);
 
+
 void
 server_stop (struct Plugin *plugin);
 
+
 void
 notify_session_end (void *cls,
-                    const struct GNUNET_PeerIdentity *
-                    peer, struct Session * s);
+                    const struct GNUNET_PeerIdentity *peer,
+                    struct GNUNET_ATS_Session *s);
+
 
+/*#ifndef PLUGIN_TRANSPORT_HTTP_H*/
+#endif
 /* end of plugin_transport_http.h */