summary refs log tree commit diff
path: root/src/header.c
diff options
context:
space:
mode:
authorNakidai <nakidai@disroot.org>2024-11-24 15:51:45 +0300
committerNakidai <nakidai@disroot.org>2024-11-24 15:51:45 +0300
commit0cd2e735fd54f96e4765b823cded724c61572031 (patch)
treeb74fd7d78daac4dd6933717a1c74a09bcbef198b /src/header.c
downloadlibhttpc-0cd2e735fd54f96e4765b823cded724c61572031.tar.gz
libhttpc-0cd2e735fd54f96e4765b823cded724c61572031.zip
Add code
Diffstat (limited to 'src/header.c')
-rw-r--r--src/header.c141
1 files changed, 141 insertions, 0 deletions
diff --git a/src/header.c b/src/header.c
new file mode 100644
index 0000000..293f435
--- /dev/null
+++ b/src/header.c
@@ -0,0 +1,141 @@
+#include "libhttpc.h"
+
+#include <ctype.h>
+
+
+#define HEADER(X) LibHTTPC_Header_##X
+
+/* General headers */
+#define S_CACHE_CONTROL         "Cache-Control"
+#define S_CONNECTION            "Connection"
+#define S_DATE                  "Date"
+#define S_PRAGMA                "Pragma"
+#define S_TRAILER               "Trailer"
+#define S_TRANSFER_ENCODING     "Transfer-Encoding"
+#define S_UPGRADE               "Upgrade"
+#define S_VIA                   "Via"
+#define S_WARNING               "Warning"
+/* Request headers */
+#define S_ACCEPT                "Accept"
+#define S_ACCEPT_CHARSET        "Accept-Charset"
+#define S_ACCEPT_ENCODING       "Accept-Encoding"
+#define S_ACCEPT_LANGUAGE       "Accept-Language"
+#define S_AUTHORIZATION         "Authorization"
+#define S_EXPECT                "Expect"
+#define S_FROM                  "From"
+#define S_HOST                  "Host"
+#define S_IF_MATCH              "If-Match"
+#define S_IF_MODIFIED_SINCE     "If-Modified-Since"
+#define S_IF_NONE_MATCH         "If-None-Match"
+#define S_IF_RANGE              "If-Range"
+#define S_IF_UNMODIFIED_SINCE   "If-Unmodified-Since"
+#define S_MAX_FORWARDS          "Max-Forwards"
+#define S_PROXY_AUTHORIZATION   "Proxy-Authorization"
+#define S_RANGE                 "Range"
+#define S_REFERER               "Referer"
+#define S_TE                    "TE"
+#define S_USER_AGENT            "User-Agent"
+/* Response headers */
+#define S_ACCEPT_RANGES         "Accept-Ranges"
+#define S_AGE                   "Age"
+#define S_ETAG                  "ETag"
+#define S_LOCATION              "Location"
+#define S_PROXY_AUTHENTICATE    "Proxy-Authenticate"
+#define S_RETRY_AFTER           "Retry-After"
+#define S_SERVER                "Server"
+#define S_VARY                  "Vary"
+#define S_WWW_AUTHENTICATE      "WWW-Authenticate"
+/* Entity headers */
+#define S_ALLOW                 "Allow"
+#define S_CONTENT_ENCODING      "Content-Encoding"
+#define S_CONTENT_LANGUAGE      "Content-Language"
+#define S_CONTENT_LENGTH        "Content-Length"
+#define S_CONTENT_LOCATION      "Content-Location"
+#define S_CONTENT_MD5           "Content-MD5"
+#define S_CONTENT_RANGE         "Content-Range"
+#define S_CONTENT_TYPE          "Content-Type"
+#define S_EXPIRES               "Expires"
+#define S_LAST_MODIFIED         "Last-Modified"
+
+static int strieq(const char *a, const char *b)
+{
+    while (*a)
+        if (tolower(*a) != tolower(*b))
+            return 0;
+    return 1;
+}
+
+#define CHECK()                     \
+    do                              \
+    {                               \
+        /* General headers */       \
+        CASE(CACHE_CONTROL);        \
+        CASE(CONNECTION);           \
+        CASE(DATE);                 \
+        CASE(PRAGMA);               \
+        CASE(TRAILER);              \
+        CASE(TRANSFER_ENCODING);    \
+        CASE(UPGRADE);              \
+        CASE(VIA);                  \
+        CASE(WARNING);              \
+        /* Request headers */       \
+        CASE(ACCEPT);               \
+        CASE(ACCEPT_CHARSET);       \
+        CASE(ACCEPT_ENCODING);      \
+        CASE(ACCEPT_LANGUAGE);      \
+        CASE(AUTHORIZATION);        \
+        CASE(EXPECT);               \
+        CASE(FROM);                 \
+        CASE(HOST);                 \
+        CASE(IF_MATCH);             \
+        CASE(IF_MODIFIED_SINCE);    \
+        CASE(IF_NONE_MATCH);        \
+        CASE(IF_RANGE);             \
+        CASE(IF_UNMODIFIED_SINCE);  \
+        CASE(MAX_FORWARDS);         \
+        CASE(PROXY_AUTHORIZATION);  \
+        CASE(RANGE);                \
+        CASE(REFERER);              \
+        CASE(TE);                   \
+        CASE(USER_AGENT);           \
+        /* Response headers */      \
+        CASE(ACCEPT_RANGES);        \
+        CASE(AGE);                  \
+        CASE(ETAG);                 \
+        CASE(LOCATION);             \
+        CASE(PROXY_AUTHENTICATE);   \
+        CASE(RETRY_AFTER);          \
+        CASE(SERVER);               \
+        CASE(VARY);                 \
+        CASE(WWW_AUTHENTICATE);     \
+        /* Entity headers */        \
+        CASE(ALLOW);                \
+        CASE(CONTENT_ENCODING);     \
+        CASE(CONTENT_LANGUAGE);     \
+        CASE(CONTENT_LENGTH);       \
+        CASE(CONTENT_LOCATION);     \
+        CASE(CONTENT_MD5);          \
+        CASE(CONTENT_RANGE);        \
+        CASE(CONTENT_TYPE);         \
+        CASE(EXPIRES);              \
+        CASE(LAST_MODIFIED);        \
+    } while(0)
+
+enum LibHTTPC_Header LibHTTPC_loadHeader(const char *header)
+{
+#define CASE(X) if (!strieq((S_##X), header)) return HEADER(X)
+    CHECK();
+#undef CASE
+    return HEADER(EXTENSION_HEADER);
+}
+
+const char *LibHTTPC_dumpHeader(enum LibHTTPC_Header header)
+{
+    switch (header)
+    {
+#define CASE(X) case HEADER(X): return S_##X;
+    CHECK();
+#undef CASE
+    }
+    return NULL;
+}