* @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 <curl/curl.h>
-#define DEBUG_HTTP 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
#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.
/**
* 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
*/
int max_connections;
+ /**
+ * Number of outbound sessions
+ */
+ unsigned int outbound_sessions;
+
+ /**
+ * Number of inbound sessions
+ */
+ unsigned int inbound_sessions;
+
/**
* Plugin HTTPS SSL/TLS options
* ----------------------------
*/
GNUNET_SCHEDULER_TaskIdentifier server_v4_task;
+ /**
+ * The IPv4 server is scheduled to run asap
+ */
+ int server_v4_immediately;
+
/**
* MHD IPv6 daemon
*/
*/
GNUNET_SCHEDULER_TaskIdentifier server_v6_task;
+ /**
+ * The IPv6 server is scheduled to run asap
+ */
+
+ int server_v6_immediately;
+
/**
* IPv4 server socket to bind to
*/
};
+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
*/
*/
uint16_t u6_port GNUNET_PACKED;
};
+GNUNET_NETWORK_STRUCT_END
+
+
+struct ServerConnection
+{
+ /* _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;
+};
+
/**
*/
struct Session
{
+ /**
+ * To whom are we talking to
+ */
+ struct GNUNET_PeerIdentity target;
/**
* Stored in a linked list.
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
*/
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
/**
* Client send handle
*/
- void *server_recv;
+ struct ServerConnection *server_recv;
/**
* Client send handle
*/
- void *server_send;
+ struct ServerConnection *server_send;
};
/**
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,
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 */