*/
/**
- * @file transport/plugin_transport_template.c
- * @brief template for a new transport service
- * @author Christian Grothoff
+ * @file transport/plugin_transport_http.c
+ * @brief http transport service plugin
+ * @author Matthias Wachs
*/
#include "platform.h"
#include <curl/curl.h>
-#define DEBUG_CURL GNUNET_YES
+#define DEBUG_CURL GNUNET_NO
#define DEBUG_HTTP GNUNET_NO
/**
struct HTTP_Message
{
/**
- * Next field for linked list
+ * next pointer for double linked list
*/
struct HTTP_Message * next;
+ /**
+ * previous pointer for double linked list
+ */
+ struct HTTP_Message * prev;
+
/**
* buffer containing data to send
*/
*/
struct GNUNET_CRYPTO_HashAsciiEncoded hash;
- struct HTTP_Message * pending_outbound_msg;
+ //struct HTTP_Message * pending_outbound_msg;
+ struct HTTP_Message * pending_outbound_msg_head;
+ struct HTTP_Message * pending_outbound_msg_tail;
struct HTTP_Message * pending_inbound_msg;
{
/* copy uploaded data to buffer */
memcpy(&cs->pending_inbound_msg->buf[cs->pending_inbound_msg->pos],upload_data,*upload_data_size);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"%u bytes forwarded to MST \n",*upload_data_size);
+ res = GNUNET_SERVER_mst_receive(cs->msgtok, cs, upload_data,*upload_data_size, GNUNET_YES, GNUNET_NO);
cs->pending_inbound_msg->pos += *upload_data_size;
*upload_data_size = 0;
return MHD_YES;
if (cs->pending_inbound_msg->pos >= sizeof (struct GNUNET_MessageHeader))
{
cur_msg = (struct GNUNET_MessageHeader *) cs->pending_inbound_msg->buf;
- res = GNUNET_SERVER_mst_receive(cs->msgtok, cs, cs->pending_inbound_msg->buf,cs->pending_inbound_msg->pos, GNUNET_YES, GNUNET_NO);
+ //res = GNUNET_SERVER_mst_receive(cs->msgtok, cs, cs->pending_inbound_msg->buf,cs->pending_inbound_msg->pos, GNUNET_YES, GNUNET_NO);
+ res = GNUNET_OK;
if ((res != GNUNET_SYSERR) && (res != GNUNET_NO))
send_error_to_client = GNUNET_NO;
}
static int remove_http_message(struct Session * ses, struct HTTP_Message * msg)
{
- struct HTTP_Message * cur;
- struct HTTP_Message * next;
-
- cur = ses->pending_outbound_msg;
- next = NULL;
-
- if (cur == NULL)
- return GNUNET_SYSERR;
-
- if (cur == msg)
- {
- ses->pending_outbound_msg = cur->next;
- GNUNET_free (cur->buf);
- GNUNET_free (cur->dest_url);
- GNUNET_free (cur);
- cur = NULL;
- return GNUNET_OK;
- }
-
- while (cur->next!=msg)
- {
- if (cur->next != NULL)
- cur = cur->next;
- else
- return GNUNET_SYSERR;
- }
+ GNUNET_free (msg->buf);
+ GNUNET_free (msg->dest_url);
- cur->next = cur->next->next;
- GNUNET_free (cur->next->buf);
- GNUNET_free (cur->next->dest_url);
- GNUNET_free (cur->next);
- cur->next = NULL;
+ GNUNET_CONTAINER_DLL_remove(ses->pending_outbound_msg_head,ses->pending_outbound_msg_tail,msg);
return GNUNET_OK;
}
static size_t send_read_callback(void *stream, size_t size, size_t nmemb, void *ptr)
{
struct Session * ses = ptr;
- struct HTTP_Message * msg = ses->pending_outbound_msg;
+ struct HTTP_Message * msg = ses->pending_outbound_msg_tail;
size_t bytes_sent;
size_t len;
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"Getting cURL handle failed\n");
return -1;
}
- msg = ses->pending_outbound_msg;
-
-
+ GNUNET_assert (NULL != ses->pending_outbound_msg_tail);
+ msg = ses->pending_outbound_msg_tail;
#if DEBUG_CURL
curl_easy_setopt(ses->curl_handle, CURLOPT_VERBOSE, 1L);
GNUNET_assert ( msg->easy_handle != NULL );
curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE, &cs);
GNUNET_assert ( cs != NULL );
- GNUNET_assert ( cs->pending_outbound_msg != NULL );
+ GNUNET_assert ( cs->pending_outbound_msg_tail != NULL );
switch (msg->msg)
{
__LINE__,
curl_easy_strerror (msg->data.result));
/* sending msg failed*/
- if (( NULL != cs->pending_outbound_msg) && ( NULL != cs->pending_outbound_msg->transmit_cont))
- cs->pending_outbound_msg->transmit_cont (cs->pending_outbound_msg->transmit_cont_cls,&cs->partner,GNUNET_SYSERR);
+ if (( NULL != cs->pending_outbound_msg_tail) && ( NULL != cs->pending_outbound_msg_tail->transmit_cont))
+ cs->pending_outbound_msg_tail->transmit_cont (cs->pending_outbound_msg_tail->transmit_cont_cls,&cs->partner,GNUNET_SYSERR);
}
else
{
cs->curl_handle=NULL;
/* Calling transmit continuation */
- if (( NULL != cs->pending_outbound_msg) && (NULL != cs->pending_outbound_msg->transmit_cont))
+ if (( NULL != cs->pending_outbound_msg_tail) && (NULL != cs->pending_outbound_msg_tail->transmit_cont))
{
/* HTTP 1xx : Last message before here was informational */
if ((http_result >=100) && (http_result < 200))
- cs->pending_outbound_msg->transmit_cont (cs->pending_outbound_msg->transmit_cont_cls,&cs->partner,GNUNET_OK);
+ cs->pending_outbound_msg_tail->transmit_cont (cs->pending_outbound_msg_tail->transmit_cont_cls,&cs->partner,GNUNET_OK);
/* HTTP 2xx: successful operations */
if ((http_result >=200) && (http_result < 300))
- cs->pending_outbound_msg->transmit_cont (cs->pending_outbound_msg->transmit_cont_cls,&cs->partner,GNUNET_OK);
+ cs->pending_outbound_msg_tail->transmit_cont (cs->pending_outbound_msg_tail->transmit_cont_cls,&cs->partner,GNUNET_OK);
/* HTTP 3xx..5xx: error */
if ((http_result >=300) && (http_result < 600))
- cs->pending_outbound_msg->transmit_cont (cs->pending_outbound_msg->transmit_cont_cls,&cs->partner,GNUNET_SYSERR);
+ cs->pending_outbound_msg_tail->transmit_cont (cs->pending_outbound_msg_tail->transmit_cont_cls,&cs->partner,GNUNET_SYSERR);
}
}
- if (GNUNET_OK != remove_http_message(cs, cs->pending_outbound_msg))
+
+ if (GNUNET_OK != remove_http_message(cs, cs->pending_outbound_msg_tail))
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Message could not be removed from session `%s'", GNUNET_i2s(&cs->partner));
/* send pending messages */
- if (cs->pending_outbound_msg != NULL)
+ if (cs->pending_outbound_msg_tail!= NULL)
{
send_select_init (cs);
}
char * url;
struct Session* cs;
struct HTTP_Message * msg;
- struct HTTP_Message * tmp;
- int bytes_sent = 0;
unsigned int res;
url = NULL;
address = NULL;
- /* find session for peer */
+
cs = GNUNET_CONTAINER_multihashmap_get (plugin->sessions, &target->hashPubKey);
- /* if (NULL != ses ) GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Existing session for peer `%s' found\n", GNUNET_i2s(target));*/
if ( cs == NULL)
{
- /* create new session object */
-
cs = create_session((char *) addr, addrlen, NULL, 0, target);
cs->is_active = GNUNET_YES;
-
- /* Insert session into linked list */
res = GNUNET_CONTAINER_multihashmap_put ( plugin->sessions,
&cs->partner.hashPubKey,
cs,
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY);
-
if (res == GNUNET_OK)
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"New Session `%s' inserted\n", GNUNET_i2s(target));
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Session `%s' found\n", GNUNET_i2s(target));
- GNUNET_assert (addr!=NULL);
- unsigned int port;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"HTTP Plugin: len `%u'\n",addrlen);
- if (cs->addr_out != NULL) GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"have addr out!!!!'\n");
+ GNUNET_assert ((addr!=NULL) && (addrlen != 0));
if (addrlen == (sizeof (struct IPv4HttpAddress)))
{
address = GNUNET_malloc(INET_ADDRSTRLEN + 1);
inet_ntop(AF_INET, &((struct IPv4HttpAddress *) addr)->ipv4_addr,address,INET_ADDRSTRLEN);
- port = ntohs(((struct IPv4HttpAddress *) addr)->u_port);
GNUNET_asprintf (&url,
"http://%s:%u/%s",
address,
- port,
+ ntohs(((struct IPv4HttpAddress *) addr)->u_port),
(char *) (&my_ascii_hash_ident));
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"HTTP Plugin: address `%s'\n",address);
GNUNET_free(address);
}
else if (addrlen == (sizeof (struct IPv6HttpAddress)))
{
address = GNUNET_malloc(INET6_ADDRSTRLEN + 1);
inet_ntop(AF_INET6, &((struct IPv6HttpAddress *) addr)->ipv6_addr,address,INET6_ADDRSTRLEN);
- port = ntohs(((struct IPv6HttpAddress *) addr)->u6_port);
GNUNET_asprintf(&url,
"http://%s:%u/%s",
- address,port,(char *) (&my_ascii_hash_ident));
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"HTTP Plugin: address `%s'\n",address);
+ address,
+ ntohs(((struct IPv6HttpAddress *) addr)->u6_port),
+ (char *) (&my_ascii_hash_ident));
GNUNET_free(address);
}
timeout = to;
msg->transmit_cont = cont;
msg->transmit_cont_cls = cont_cls;
memcpy (msg->buf,msgbuf, msgbuf_size);
- /* insert created message in list of pending messages */
- if (cs->pending_outbound_msg == NULL)
- {
- cs->pending_outbound_msg = msg;
- }
- tmp = cs->pending_outbound_msg;
- while ( NULL != tmp->next)
- {
- tmp = tmp->next;
- }
- if ( tmp != msg)
- {
- tmp->next = msg;
- }
+ /* insert created message in double linked list of pending messages */
+ GNUNET_CONTAINER_DLL_insert (cs->pending_outbound_msg_head, cs->pending_outbound_msg_tail, msg);
+
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"HTTP Plugin: sending %u bytes of data from peer `%4.4s' to peer `%s'\n",msgbuf_size,(char *) &my_ascii_hash_ident,GNUNET_i2s(target));
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"HTTP Plugin: url `%s'\n",url);
- if (msg == cs->pending_outbound_msg)
+ if (msg == cs->pending_outbound_msg_tail)
{
- bytes_sent = send_select_init (cs);
- return bytes_sent;
+ return send_select_init (cs);
}
return msgbuf_size;
}
/* freeing messages */
struct HTTP_Message *cur;
struct HTTP_Message *tmp;
- cur = cs->pending_outbound_msg;
+ cur = cs->pending_outbound_msg_head;
while (cur != NULL)
{
return api;
}
-/* end of plugin_transport_template.c */
+/* end of plugin_transport_http.c */