#define LIBGNUNET_PLUGIN_TRANSPORT_DONE libgnunet_plugin_transport_http_server_done
#endif
-#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)
-#else
-#define HTTP_NOT_VALIDATED_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 15)
-#define TIMEOUT_LOG GNUNET_ERROR_TYPE_DEBUG
-#define TIMEOUT GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT
-#endif
-
#define HTTP_ERROR_RESPONSE "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\"><HTML><HEAD><TITLE>404 Not Found</TITLE></HEAD><BODY><H1>Not Found</H1>The requested URL was not found on this server.<P><HR><ADDRESS></ADDRESS></BODY></HTML>"
#define _RECEIVE 0
#define _SEND 1
*/
void *addr;
-
/**
* Address length
*/
*/
struct GNUNET_NAT_Handle *nat;
- /**
- * 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;
-
/**
* List of own addresses
*/
if (url_len < 105)
{
+ GNUNET_break (0);
goto error; /* too short */
}
hash_start = strrchr (url, '/');
if (NULL == hash_start)
{
+ GNUNET_break (0);
goto error; /* '/' delimiter not found */
}
if (hash_start >= url_end)
{
+ GNUNET_break (0);
goto error; /* mal formed */
}
hash_start++;
hash_end = strrchr (hash_start, ';');
if (NULL == hash_end)
+ {
+ GNUNET_break (0);
goto error; /* ';' delimiter not found */
+ }
+
if (hash_end >= url_end)
{
+ GNUNET_break (0);
goto error; /* mal formed */
}
if (hash_start >= hash_end)
{
+ GNUNET_break (0);
goto error; /* mal formed */
}
if ((strlen(hash_start) - strlen(hash_end)) != 103)
{
+ GNUNET_break (0);
goto error; /* invalid hash length */
}
hash[103] = '\0';
if (GNUNET_OK != GNUNET_CRYPTO_hash_from_string ((const char *) hash, &(target.hashPubKey)))
{
+ GNUNET_break (0);
goto error; /* mal formed */
}
if (hash_end >= url_end)
{
+ GNUNET_break (0);
goto error; /* mal formed */
}
tag = strtoul (tag_start, &tag_end, 10);
if (tag == 0)
{
+ GNUNET_break (0);
goto error; /* mal formed */
}
if (tag_end == NULL)
{
+ GNUNET_break (0);
goto error; /* mal formed */
}
if (tag_end != url_end)
{
+ GNUNET_break (0);
goto error; /* mal formed */
}
}
}
GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, s->plugin->name,
- "Sent %u bytes\n", s, bytes_read);
+ "Sent %u bytes to peer `%s' with session %p \n", bytes_read, GNUNET_i2s (&s->target), s);
if ((s->next_receive.abs_value <= now.abs_value))
{
GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name,
- "PUT with %u bytes forwarded to MST\n", s,
+ "PUT with %u bytes forwarded to MST\n",
*upload_data_size);
if (s->msg_tk == NULL)
{
void
server_stop (struct HTTP_Server_Plugin *plugin)
{
- struct MHD_Daemon *server_v4_tmp = plugin->server_v4;
- plugin->server_v4 = NULL;
-
- struct MHD_Daemon *server_v6_tmp = plugin->server_v6;
- plugin->server_v6 = NULL;
-
if (plugin->server_v4_task != GNUNET_SCHEDULER_NO_TASK)
{
GNUNET_SCHEDULER_cancel (plugin->server_v4_task);
plugin->server_v6_task = GNUNET_SCHEDULER_NO_TASK;
}
- if (server_v6_tmp != NULL)
+ if (plugin->server_v4 != NULL)
{
- MHD_stop_daemon (server_v4_tmp);
+ MHD_stop_daemon (plugin->server_v4);
+ plugin->server_v4 = NULL;
}
- if (server_v6_tmp != NULL)
+ if ( plugin->server_v6 != NULL)
{
- MHD_stop_daemon (server_v6_tmp);
+ MHD_stop_daemon (plugin->server_v6);
+ plugin->server_v6 = NULL;
}
p = NULL;
struct HTTP_Server_Plugin *plugin = cls;
struct HttpAddressWrapper *w = NULL;
- if ((AF_INET == addr->sa_family) && (GNUNET_NO == plugin->use_ipv4))
- return;
-
- if ((AF_INET6 == addr->sa_family) && (GNUNET_NO == plugin->use_ipv6))
- return;
-
w = GNUNET_malloc (sizeof (struct HttpAddressWrapper));
w->addr = http_common_address_from_socket (plugin->protocol, addr, addrlen);
if (NULL == w->addr)
"Notifying transport to add address `%s'\n",
http_common_plugin_address_to_string(NULL, w->addr, w->addrlen));
- plugin->env->notify_address (plugin->env->cls, add_remove, w->addr, w->addrlen);
+ plugin->env->notify_address (plugin->env->cls, add_remove, w->addr, w->addrlen, "http_client");
}
"Notifying transport to remove address `%s'\n",
http_common_plugin_address_to_string (NULL, w->addr, w->addrlen));
GNUNET_CONTAINER_DLL_remove (plugin->addr_head, plugin->addr_tail, w);
- plugin->env->notify_address (plugin->env->cls, add_remove, w->addr, w->addrlen);
+ plugin->env->notify_address (plugin->env->cls, add_remove, w->addr, w->addrlen, "http_client");
GNUNET_free (w->addr);
GNUNET_free (w);
}
struct HTTP_Server_Plugin *plugin = cls;
GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name,
- "NPMC called %s to address `%s'\n",
+ "NAT called to %s address `%s'\n",
(add_remove == GNUNET_NO) ? "remove" : "add",
GNUNET_a2s (addr, addrlen));
+ if (AF_INET == addr->sa_family)
+ {
+ struct sockaddr_in *s4 = (struct sockaddr_in *) addr;
+
+ if (GNUNET_NO == plugin->use_ipv4)
+ return;
+
+ if ((NULL != plugin->server_addr_v4) &&
+ (0 != memcmp (&plugin->server_addr_v4->sin_addr,
+ &s4->sin_addr, sizeof (struct in_addr))))
+ {
+ GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name,
+ "Skipping address `%s' (not bindto address)\n",
+ GNUNET_a2s (addr, addrlen));
+ return;
+ }
+ }
+
+ if (AF_INET6 == addr->sa_family)
+ {
+ struct sockaddr_in6 *s6 = (struct sockaddr_in6 *) addr;
+ if (GNUNET_NO == plugin->use_ipv6)
+ return;
+
+ if ((NULL != plugin->server_addr_v6) &&
+ (0 != memcmp (&plugin->server_addr_v6->sin6_addr,
+ &s6->sin6_addr, sizeof (struct in6_addr))))
+ {
+ GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name,
+ "Skipping address `%s' (not bindto address)\n",
+ GNUNET_a2s (addr, addrlen));
+ return;
+ }
+ }
+
switch (add_remove)
{
case GNUNET_YES:
plugin->ext_addr_len = strlen (plugin->ext_addr) + 1;
GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name,
"Notifying transport about external hostname address `%s'\n", plugin->ext_addr);
- plugin->env->notify_address (plugin->env->cls, GNUNET_YES, plugin->ext_addr, plugin->ext_addr_len );
+ plugin->env->notify_address (plugin->env->cls, GNUNET_YES,
+ plugin->ext_addr, plugin->ext_addr_len,
+ "http_client");
}
struct Session *pos;
struct Session *next;
+ if (NULL == api->cls)
+ {
+ GNUNET_free (api);
+ return NULL;
+ }
+
if (GNUNET_SCHEDULER_NO_TASK != plugin->notify_ext_task)
{
GNUNET_SCHEDULER_cancel (plugin->notify_ext_task);
plugin->env->notify_address (plugin->env->cls,
GNUNET_NO,
plugin->ext_addr,
- plugin->ext_addr_len);
+ plugin->ext_addr_len,
+ "http_client");
}
/* Stop to report addresses to transport service */
plugin = GNUNET_malloc (sizeof (struct HTTP_Server_Plugin));
plugin->env = env;
p = plugin;
+
+ if (NULL == env->receive)
+ {
+ /* run in 'stub' mode (i.e. as part of gnunet-peerinfo), don't fully
+ initialze the plugin or the API */
+ api = GNUNET_malloc (sizeof (struct GNUNET_TRANSPORT_PluginFunctions));
+ api->cls = NULL;
+ api->address_to_string = &http_common_plugin_address_to_string;
+ api->string_to_address = &http_common_plugin_string_to_address;
+ api->address_pretty_printer = &http_common_plugin_address_pretty_printer;
+ return api;
+ }
+
api = GNUNET_malloc (sizeof (struct GNUNET_TRANSPORT_PluginFunctions));
api->cls = plugin;
api->send = &http_server_plugin_send;