Check that you are not present in trail twice
[oweals/gnunet.git] / src / transport / plugin_transport_http.h
index be8f93dd2dfeb0858c490fe0ef34e7812815f2ec..ae0c784eef230b7311bf1fd87ee564f12a15bbe3 100644 (file)
@@ -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"
@@ -45,7 +47,7 @@
 #define DEBUG_HTTP GNUNET_EXTRA_LOGGING
 #define VERBOSE_SERVER GNUNET_EXTRA_LOGGING
 #define VERBOSE_CLIENT GNUNET_EXTRA_LOGGING
-#define VERBOSE_CURL GNUNET_EXTRA_LOGGING
+#define VERBOSE_CURL GNUNET_NO
 
 #if BUILD_HTTPS
 #define LIBGNUNET_PLUGIN_TRANSPORT_INIT libgnunet_plugin_transport_https_init
@@ -96,27 +98,41 @@ struct Plugin
   /**
    * IPv4 addresses DLL head
    */
-  struct IPv4HttpAddressWrapper *ipv4_addr_head;
+  struct HttpAddressWrapper *addr_head;
 
   /**
    * IPv4 addresses DLL tail
    */
-  struct IPv4HttpAddressWrapper *ipv4_addr_tail;
+  struct HttpAddressWrapper *addr_tail;
+
 
   /**
-   * IPv6 addresses DLL head
+   * Plugin configuration
+   * --------------------
    */
-  struct IPv6HttpAddressWrapper *ipv6_addr_head;
 
   /**
-   * IPv6 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 IPv6HttpAddressWrapper *ipv6_addr_tail;
+  char *external_hostname;
 
   /**
-   * Plugin configuration
-   * --------------------
+   * External hostname the plugin can be connected to, can be different to
+   * the host's FQDN, used e.g. for reverse proxying
    */
+  struct HttpAddress *ext_addr;
+
+  /**
+   * External address length
+   */
+  size_t ext_addr_len;
+
+  /**
+   * Task calling transport service about external address
+   */
+  GNUNET_SCHEDULER_TaskIdentifier notify_ext_task;
+
 
   /**
    * Plugin name
@@ -159,6 +175,16 @@ struct Plugin
    */
   int max_connections;
 
+  /**
+   * Number of outbound sessions
+   */
+  unsigned int outbound_sessions;
+
+  /**
+   * Number of inbound sessions
+   */
+  unsigned int inbound_sessions;
+
   /**
    * Plugin HTTPS SSL/TLS options
    * ----------------------------
@@ -215,6 +241,11 @@ struct Plugin
    */
   GNUNET_SCHEDULER_TaskIdentifier server_v4_task;
 
+  /**
+   * The IPv4 server is scheduled to run asap
+   */
+  int server_v4_immediately;
+
   /**
    * MHD IPv6 daemon
    */
@@ -225,6 +256,12 @@ struct Plugin
    */
   GNUNET_SCHEDULER_TaskIdentifier server_v6_task;
 
+  /**
+   * The IPv6 server is scheduled to run asap
+   */
+
+  int server_v6_immediately;
+
   /**
    * IPv4 server socket to bind to
    */
@@ -262,6 +299,22 @@ struct Plugin
 
 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
  */
@@ -295,11 +348,33 @@ struct IPv6HttpAddress
 };
 GNUNET_NETWORK_STRUCT_END
 
+
+struct ServerRequest
+{
+  /* _RECV or _SEND */
+  int direction;
+
+  /* Should this connection get disconnected? GNUNET_YES/NO  */
+  int disconnect;
+
+  /* The session this server connection belongs to */
+  struct Session *session;
+
+  /* The MHD connection */
+  struct MHD_Connection *mhd_conn;
+};
+
+
+
 /**
  * Session handle for connections.
  */
 struct Session
 {
+  /**
+   * To whom are we talking to
+   */
+  struct GNUNET_PeerIdentity target;
 
   /**
    * Stored in a linked list.
@@ -331,11 +406,6 @@ struct Session
    */
   uint32_t ats_address_network_type;
 
-  /**
-   * To whom are we talking to
-   */
-  struct GNUNET_PeerIdentity target;
-
   /**
    * next pointer for double linked list
    */
@@ -389,6 +459,11 @@ struct Session
    */
   GNUNET_SCHEDULER_TaskIdentifier recv_wakeup_task;
 
+  /**
+   * Session timeout task
+   */
+  GNUNET_SCHEDULER_TaskIdentifier timeout_task;
+
   /**
    * Is client send handle paused since there are no data to send?
    * GNUNET_YES/NO
@@ -402,12 +477,12 @@ struct Session
   /**
    * Client send handle
    */
-  void *server_recv;
+  struct ServerRequest *server_recv;
 
   /**
    * Client send handle
    */
-  void *server_send;
+  struct ServerRequest *server_send;
 };
 
 /**
@@ -453,13 +528,18 @@ struct HTTP_Message
   void *transmit_cont_cls;
 };
 
+struct Session *
+create_session (struct Plugin *plugin, const struct GNUNET_PeerIdentity *target,
+                const void *addr, size_t addrlen);
+
+int
+exist_session (struct Plugin *plugin, struct Session *s);
+
 void
 delete_session (struct 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);
+int
+exist_session (struct Plugin *plugin, struct Session *s);
 
 struct GNUNET_TIME_Relative
 http_plugin_receive (void *cls, const struct GNUNET_PeerIdentity *peer,
@@ -501,4 +581,6 @@ void
 notify_session_end (void *cls, const struct GNUNET_PeerIdentity *peer,
                     struct Session *s);
 
+/*#ifndef PLUGIN_TRANSPORT_HTTP_H*/
+#endif
 /* end of plugin_transport_http.h */