gnunet-svn
[Top][All Lists]
Advanced

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

[libmicrohttpd] 03/04: connection.c: added detection of standard HTTP me


From: gnunet
Subject: [libmicrohttpd] 03/04: connection.c: added detection of standard HTTP methods
Date: Sun, 13 Jun 2021 10:55:34 +0200

This is an automated email from the git hooks/post-receive script.

karlson2k pushed a commit to branch master
in repository libmicrohttpd.

commit 8391cfa210f8e5b6cac2fff9d8e49f1003c91a44
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
AuthorDate: Sat Jun 12 20:31:42 2021 +0300

    connection.c: added detection of standard HTTP methods
    
    Detection was added only for basic methods as defined in RFC7231
---
 src/microhttpd/connection.c | 58 +++++++++++++++++++++++++++++++++++++++++++++
 src/microhttpd/internal.h   | 54 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 112 insertions(+)

diff --git a/src/microhttpd/connection.c b/src/microhttpd/connection.c
index 7410949c..ed1ed482 100644
--- a/src/microhttpd/connection.c
+++ b/src/microhttpd/connection.c
@@ -2214,6 +2214,58 @@ parse_http_version (struct MHD_Connection *connection,
 }
 
 
+/**
+ * Detect standard HTTP request method
+ *
+ * @param connection the connection
+ * @param method the pointer to HTTP request method string
+ * @param len the length of @a method in bytes
+ * @return #MHD_YES if HTTP method is valid string,
+ *         #MHD_NO if HTTP method string is not valid.
+ */
+static enum MHD_Result
+parse_http_std_method (struct MHD_Connection *connection,
+                       const char *method,
+                       size_t len)
+{
+  const char *const m = method; /**< short alias */
+  mhd_assert (NULL != m);
+
+  if (0 == len)
+    return MHD_NO;
+
+  if ((MHD_STATICSTR_LEN_ (MHD_HTTP_METHOD_GET) == len) &&
+      (0 == memcmp (m, MHD_HTTP_METHOD_GET, len)))
+    connection->http_mthd = MHD_HTTP_MTHD_GET;
+  else if ((MHD_STATICSTR_LEN_ (MHD_HTTP_METHOD_HEAD) == len) &&
+           (0 == memcmp (m, MHD_HTTP_METHOD_HEAD, len)))
+    connection->http_mthd = MHD_HTTP_MTHD_HEAD;
+  else if ((MHD_STATICSTR_LEN_ (MHD_HTTP_METHOD_POST) == len) &&
+           (0 == memcmp (m, MHD_HTTP_METHOD_POST, len)))
+    connection->http_mthd = MHD_HTTP_MTHD_POST;
+  else if ((MHD_STATICSTR_LEN_ (MHD_HTTP_METHOD_PUT) == len) &&
+           (0 == memcmp (m, MHD_HTTP_METHOD_PUT, len)))
+    connection->http_mthd = MHD_HTTP_MTHD_PUT;
+  else if ((MHD_STATICSTR_LEN_ (MHD_HTTP_METHOD_DELETE) == len) &&
+           (0 == memcmp (m, MHD_HTTP_METHOD_DELETE, len)))
+    connection->http_mthd = MHD_HTTP_MTHD_DELETE;
+  else if ((MHD_STATICSTR_LEN_ (MHD_HTTP_METHOD_CONNECT) == len) &&
+           (0 == memcmp (m, MHD_HTTP_METHOD_CONNECT, len)))
+    connection->http_mthd = MHD_HTTP_MTHD_CONNECT;
+  else if ((MHD_STATICSTR_LEN_ (MHD_HTTP_METHOD_OPTIONS) == len) &&
+           (0 == memcmp (m, MHD_HTTP_METHOD_OPTIONS, len)))
+    connection->http_mthd = MHD_HTTP_MTHD_OPTIONS;
+  else if ((MHD_STATICSTR_LEN_ (MHD_HTTP_METHOD_TRACE) == len) &&
+           (0 == memcmp (m, MHD_HTTP_METHOD_TRACE, len)))
+    connection->http_mthd = MHD_HTTP_MTHD_TRACE;
+  else
+    connection->http_mthd = MHD_HTTP_MTHD_OTHER;
+
+  /* Any method string with non-zero length is valid */
+  return MHD_YES;
+}
+
+
 /**
  * Parse the first line of the HTTP HEADER.
  *
@@ -2240,9 +2292,13 @@ parse_initial_message_line (struct MHD_Connection 
*connection,
     return MHD_NO;              /* serious error */
   uri[0] = '\0';
   connection->method = line;
+  if (MHD_NO == parse_http_std_method (connection, connection->method,
+                                       (size_t) (uri - line)))
+    return MHD_NO;
   uri++;
   /* Skip any spaces. Not required by standard but allow
      to be more tolerant. */
+  /* TODO: do not skip them in standard mode */
   while ( (' ' == uri[0]) &&
           ( (size_t) (uri - line) < line_len) )
     uri++;
@@ -2263,6 +2319,7 @@ parse_initial_message_line (struct MHD_Connection 
*connection,
     /* Search from back to accept malformed URI with space */
     http_version = line + line_len - 1;
     /* Skip any trailing spaces */
+    /* TODO: do not skip them in standard mode */
     while ( (' ' == http_version[0]) &&
             (http_version > uri) )
       http_version--;
@@ -3934,6 +3991,7 @@ MHD_connection_handle_idle (struct MHD_Connection 
*connection)
       connection->current_chunk_size = 0;
       connection->current_chunk_offset = 0;
       connection->method = NULL;
+      connection->http_mthd = MHD_HTTP_MTHD_NO_METHOD;
       connection->url = NULL;
       connection->write_buffer = NULL;
       connection->write_buffer_size = 0;
diff --git a/src/microhttpd/internal.h b/src/microhttpd/internal.h
index a11da7f7..f4c9589e 100644
--- a/src/microhttpd/internal.h
+++ b/src/microhttpd/internal.h
@@ -770,6 +770,55 @@ enum MHD_HTTP_Version
   MHD_HTTP_VER_FUTURE = 100
 };
 
+/**
+ * The HTTP method.
+ *
+ * Only primary methods (specified in RFC7231) defined here.
+ */
+enum MHD_HTTP_Method
+{
+  /**
+   * No request string has been received yet
+   */
+  MHD_HTTP_MTHD_NO_METHOD = 0,
+  /**
+   * HTTP method GET
+   */
+  MHD_HTTP_MTHD_GET = 1,
+  /**
+   * HTTP method HEAD
+   */
+  MHD_HTTP_MTHD_HEAD = 2,
+  /**
+   * HTTP method POST
+   */
+  MHD_HTTP_MTHD_POST = 3,
+  /**
+   * HTTP method PUT
+   */
+  MHD_HTTP_MTHD_PUT = 4,
+  /**
+   * HTTP method DELETE
+   */
+  MHD_HTTP_MTHD_DELETE = 5,
+  /**
+   * HTTP method CONNECT
+   */
+  MHD_HTTP_MTHD_CONNECT = 6,
+  /**
+   * HTTP method OPTIONS
+   */
+  MHD_HTTP_MTHD_OPTIONS = 7,
+  /**
+   * HTTP method TRACE
+   */
+  MHD_HTTP_MTHD_TRACE = 8,
+  /**
+   * Other HTTP method. Check the string value.
+   */
+  MHD_HTTP_MTHD_OTHER = 1000
+};
+
 /**
  * Returns boolean 'true' if HTTP version is supported by MHD
  */
@@ -879,6 +928,11 @@ struct MHD_Connection
    */
   char *method;
 
+  /**
+   * The request method as enum.
+   */
+  enum MHD_HTTP_Method http_mthd;
+
   /**
    * Requested URL (everything after "GET" only).  Allocated
    * in pool.

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

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