[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r11897 - gnunet/src/transport
From: |
gnunet |
Subject: |
[GNUnet-SVN] r11897 - gnunet/src/transport |
Date: |
Wed, 23 Jun 2010 13:01:02 +0200 |
Author: wachs
Date: 2010-06-23 13:01:02 +0200 (Wed, 23 Jun 2010)
New Revision: 11897
Modified:
gnunet/src/transport/plugin_transport_http.c
Log:
outbound messages are now stored in a dll
Modified: gnunet/src/transport/plugin_transport_http.c
===================================================================
--- gnunet/src/transport/plugin_transport_http.c 2010-06-23 10:49:53 UTC
(rev 11896)
+++ gnunet/src/transport/plugin_transport_http.c 2010-06-23 11:01:02 UTC
(rev 11897)
@@ -19,9 +19,9 @@
*/
/**
- * @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"
@@ -41,7 +41,7 @@
#include <curl/curl.h>
-#define DEBUG_CURL GNUNET_YES
+#define DEBUG_CURL GNUNET_NO
#define DEBUG_HTTP GNUNET_NO
/**
@@ -117,11 +117,16 @@
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
*/
char *buf;
@@ -243,7 +248,9 @@
*/
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;
@@ -543,6 +550,8 @@
{
/* 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;
@@ -579,7 +588,8 @@
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;
}
@@ -711,38 +721,10 @@
static int remove_http_message(struct Session * ses, struct HTTP_Message * msg)
{
- struct HTTP_Message * cur;
- struct HTTP_Message * next;
+ GNUNET_free (msg->buf);
+ GNUNET_free (msg->dest_url);
- 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;
- }
-
- 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;
}
@@ -786,7 +768,7 @@
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;
@@ -867,10 +849,9 @@
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);
#endif
@@ -932,7 +913,7 @@
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)
{
@@ -948,8 +929,8 @@
__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
{
@@ -961,23 +942,24 @@
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);
}
@@ -1098,28 +1080,20 @@
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));
@@ -1128,32 +1102,27 @@
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;
@@ -1167,26 +1136,14 @@
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;
}
@@ -1458,7 +1415,7 @@
/* freeing messages */
struct HTTP_Message *cur;
struct HTTP_Message *tmp;
- cur = cs->pending_outbound_msg;
+ cur = cs->pending_outbound_msg_head;
while (cur != NULL)
{
@@ -1643,4 +1600,4 @@
return api;
}
-/* end of plugin_transport_template.c */
+/* end of plugin_transport_http.c */
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r11897 - gnunet/src/transport,
gnunet <=