gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r5046 - in libmicrohttpd: . src/daemon src/include


From: gnunet
Subject: [GNUnet-SVN] r5046 - in libmicrohttpd: . src/daemon src/include
Date: Wed, 13 Jun 2007 18:09:32 -0600 (MDT)

Author: grothoff
Date: 2007-06-13 18:09:32 -0600 (Wed, 13 Jun 2007)
New Revision: 5046

Modified:
   libmicrohttpd/README
   libmicrohttpd/src/daemon/daemon.c
   libmicrohttpd/src/daemon/daemontest.c
   libmicrohttpd/src/daemon/minimal_example.c
   libmicrohttpd/src/daemon/response.c
   libmicrohttpd/src/daemon/session.c
   libmicrohttpd/src/include/microhttpd.h
Log:
extended API, setting content length automatically if needed

Modified: libmicrohttpd/README
===================================================================
--- libmicrohttpd/README        2007-06-13 23:09:25 UTC (rev 5045)
+++ libmicrohttpd/README        2007-06-14 00:09:32 UTC (rev 5046)
@@ -27,7 +27,12 @@
 - send proper error code back if headers are too long
   (investigate what we should do with those headers,
    read?  give user control?)
+- http 1.0 compatibility (if 1.0, force connection
+  close at the end!)
 
+
+
+
 For IPv6:
 =========
 daemon.c:
@@ -41,3 +46,13 @@
 - define appropriate APIs
 - everything else
 
+
+Other:
+======
+- allow client to determine http 1.0 vs. 1.1
+  (API extension)
+- allow client to control size of input/output
+  buffers
+
+
+

Modified: libmicrohttpd/src/daemon/daemon.c
===================================================================
--- libmicrohttpd/src/daemon/daemon.c   2007-06-13 23:09:25 UTC (rev 5045)
+++ libmicrohttpd/src/daemon/daemon.c   2007-06-14 00:09:32 UTC (rev 5046)
@@ -467,6 +467,7 @@
              strerror(errno));
     return NULL;
   }
+  /* FIXME: setsockopt: SO_REUSEADDR? */
   memset(&servaddr,
         0,
         sizeof(struct sockaddr_in));  
@@ -541,7 +542,8 @@
       close(daemon->connections->socket_fd);
       daemon->connections->socket_fd = -1;
     }
-    pthread_join(daemon->connections->pid, &unused);
+    if (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION))
+      pthread_join(daemon->connections->pid, &unused);
 
     MHD_cleanup_sessions(daemon);
   }

Modified: libmicrohttpd/src/daemon/daemontest.c
===================================================================
--- libmicrohttpd/src/daemon/daemontest.c       2007-06-13 23:09:25 UTC (rev 
5045)
+++ libmicrohttpd/src/daemon/daemontest.c       2007-06-14 00:09:32 UTC (rev 
5046)
@@ -29,6 +29,7 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include <string.h>
+#include <stdio.h>
 
 static int testStartError() {
   struct MHD_Daemon * d;

Modified: libmicrohttpd/src/daemon/minimal_example.c
===================================================================
--- libmicrohttpd/src/daemon/minimal_example.c  2007-06-13 23:09:25 UTC (rev 
5045)
+++ libmicrohttpd/src/daemon/minimal_example.c  2007-06-14 00:09:32 UTC (rev 
5046)
@@ -49,7 +49,7 @@
   struct MHD_Response * response;
   int ret;
 
-  if (0 != strcmp(me, "GET"))
+  if (0 != strcmp(method, "GET"))
     return MHD_NO; /* unexpected method */
   response = MHD_create_response_from_data(strlen(me),
                                           (void*) me,

Modified: libmicrohttpd/src/daemon/response.c
===================================================================
--- libmicrohttpd/src/daemon/response.c 2007-06-13 23:09:25 UTC (rev 5045)
+++ libmicrohttpd/src/daemon/response.c 2007-06-14 00:09:32 UTC (rev 5046)
@@ -126,6 +126,27 @@
 
 
 /**
+ * Get a particular header from the response.
+ *
+ * @param key which header to get
+ * @return NULL if header does not exist
+ */ 
+const char *
+MHD_get_response_header(struct MHD_Response * response,
+                       const char * key) {
+  struct MHD_HTTP_Header * pos;
+  pos = response->first_header;
+  while (pos != NULL) {
+    if (0 == strcmp(key,
+                   pos->header))
+      return pos->value;
+    pos = pos->next;
+  }
+  return NULL;
+}
+
+
+/**
  * Create a response object.  The response object can be extended with
  * header information and then be used any number of times.
  *

Modified: libmicrohttpd/src/daemon/session.c
===================================================================
--- libmicrohttpd/src/daemon/session.c  2007-06-13 23:09:25 UTC (rev 5045)
+++ libmicrohttpd/src/daemon/session.c  2007-06-14 00:09:32 UTC (rev 5046)
@@ -111,7 +111,7 @@
        (response == NULL) ||
        (session->response != NULL) ||
        (session->bodyReceived == 0) ||
-       (session->headers_received == 0) )
+       (session->headersReceived == 0) )
     return MHD_NO;     
   MHD_increment_response_rc(response);
   session->response = response;
@@ -131,13 +131,13 @@
                      fd_set * write_fd_set,
                      fd_set * except_fd_set,
                      int * max_fd) {
-  if ( (session->headers_received == 0) ||
+  if ( (session->headersReceived == 0) ||
        (session->readLoc < session->read_buffer_size) )
     FD_SET(session->socket_fd, read_fd_set);
   if (session->response != NULL) 
     FD_SET(session->socket_fd, write_fd_set);
   if ( (session->socket_fd > *max_fd) &&
-       ( (session->headers_received == 0) ||
+       ( (session->headersReceived == 0) ||
         (session->readLoc < session->read_buffer_size) ||
         (session->response != NULL) ) )
     *max_fd = session->socket_fd;
@@ -310,7 +310,7 @@
   struct MHD_Access_Handler * ah;
   unsigned int processed;
 
-  if (session->headers_received == 0)
+  if (session->headersReceived == 0)
     abort(); /* bad timing... */
   ah = MHD_find_access_handler(session);
   processed = session->readLoc;
@@ -356,7 +356,7 @@
  
 
   if ( (session->readLoc >= session->read_buffer_size) &&
-       (session->headers_received == 0) ) {
+       (session->headersReceived == 0) ) {
     /* need to grow read buffer */
     tmp = malloc(session->read_buffer_size * 2 + MHD_MAX_BUF_SIZE);
     memcpy(tmp,
@@ -405,6 +405,34 @@
 }
 
 /**
+ * Check if we need to set some additional headers
+ * for http-compiliance.
+ */
+static void 
+MHD_add_extra_headers(struct MHD_Session * session) {
+  const char * have;
+  char buf[128];
+
+  if (session->response->total_size == -1) {
+    have = MHD_get_response_header(session->response,
+                                  "Connection");
+    if (have == NULL)
+      MHD_add_response_header(session->response,
+                             "Connection",
+                             "close");
+  } else if (NULL == MHD_get_response_header(session->response,
+                                            "Content-length")) {
+    snprintf(buf,
+            128,
+            "%llu",
+            (unsigned long long) session->response->total_size);
+    MHD_add_response_header(session->response,
+                           "Content-length",
+                           buf);
+  }
+}
+
+/**
  * Allocate the session's write buffer and
  * fill it with all of the headers from the
  * HTTPd's response.
@@ -417,6 +445,7 @@
   char code[32];
   char * data;
 
+  MHD_add_extra_headers(session);
   sprintf(code,
          "HTTP/1.1 %u\r\n", 
          session->responseCode);
@@ -551,7 +580,7 @@
     abort(); /* internal error */
   if (session->messagePos == response->data_size) {
     if ( (session->bodyReceived == 0) ||
-        (session->headers_received == 0) )
+        (session->headersReceived == 0) )
       abort(); /* internal error */
     MHD_destroy_response(response);
     session->responseCode = 0;

Modified: libmicrohttpd/src/include/microhttpd.h
===================================================================
--- libmicrohttpd/src/include/microhttpd.h      2007-06-13 23:09:25 UTC (rev 
5045)
+++ libmicrohttpd/src/include/microhttpd.h      2007-06-14 00:09:32 UTC (rev 
5046)
@@ -507,6 +507,17 @@
                         void * iterator_cls);
 
 
+/**
+ * Get a particular header from the response.
+ *
+ * @param key which header to get
+ * @return NULL if header does not exist
+ */ 
+const char *
+MHD_get_response_header(struct MHD_Response * response,
+                       const char * key);
+
+
 #if 0 /* keep Emacsens' auto-indent happy */
 {
 #endif





reply via email to

[Prev in Thread] Current Thread [Next in Thread]