summaryrefslogtreecommitdiffstats
path: root/libnetdata/url
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--libnetdata/url/Makefile.am8
-rw-r--r--libnetdata/url/README.md14
-rw-r--r--src/libnetdata/url/url.c (renamed from libnetdata/url/url.c)34
-rw-r--r--src/libnetdata/url/url.h (renamed from libnetdata/url/url.h)2
4 files changed, 25 insertions, 33 deletions
diff --git a/libnetdata/url/Makefile.am b/libnetdata/url/Makefile.am
deleted file mode 100644
index 161784b8f..000000000
--- a/libnetdata/url/Makefile.am
+++ /dev/null
@@ -1,8 +0,0 @@
-# SPDX-License-Identifier: GPL-3.0-or-later
-
-AUTOMAKE_OPTIONS = subdir-objects
-MAINTAINERCLEANFILES = $(srcdir)/Makefile.in
-
-dist_noinst_DATA = \
- README.md \
- $(NULL)
diff --git a/libnetdata/url/README.md b/libnetdata/url/README.md
deleted file mode 100644
index 1ba51e2ea..000000000
--- a/libnetdata/url/README.md
+++ /dev/null
@@ -1,14 +0,0 @@
-<!--
-title: "URL"
-custom_edit_url: https://github.com/netdata/netdata/edit/master/libnetdata/url/README.md
-sidebar_label: "URL"
-learn_status: "Published"
-learn_topic_type: "Tasks"
-learn_rel_path: "Developers/libnetdata"
--->
-
-# URL
-
-The URL library contains common functions useful for URLs, like conversion from/to hex,
-URL encode/decode and query string parsing.
-
diff --git a/libnetdata/url/url.c b/src/libnetdata/url/url.c
index 39366cbe8..e84971714 100644
--- a/libnetdata/url/url.c
+++ b/src/libnetdata/url/url.c
@@ -236,7 +236,8 @@ fail_cleanup:
return NULL;
}
-inline bool url_is_request_complete(char *begin, char *end, size_t length, char **post_payload, size_t *post_payload_size) {
+inline bool
+url_is_request_complete_and_extract_payload(const char *begin, const char *end, size_t length, BUFFER **post_payload) {
if (begin == end || length < 4)
return false;
@@ -244,29 +245,42 @@ inline bool url_is_request_complete(char *begin, char *end, size_t length, char
return strstr(end - 4, "\r\n\r\n");
}
else if(unlikely(strncmp(begin, "POST ", 5) == 0 || strncmp(begin, "PUT ", 4) == 0)) {
- char *cl = strstr(begin, "Content-Length: ");
+ const char *cl = strcasestr(begin, "Content-Length: ");
if(!cl) return false;
cl = &cl[16];
size_t content_length = str2ul(cl);
- char *payload = strstr(cl, "\r\n\r\n");
+ const char *payload = strstr(cl, "\r\n\r\n");
if(!payload) return false;
payload += 4;
size_t payload_length = length - (payload - begin);
if(payload_length == content_length) {
- if(post_payload && post_payload_size) {
- if (*post_payload)
- freez(*post_payload);
+ if(!*post_payload)
+ *post_payload = buffer_create(payload_length + 1, NULL);
- *post_payload = mallocz(payload_length + 1);
- memcpy(*post_payload, payload, payload_length);
- (*post_payload)[payload_length] = '\0';
+ buffer_contents_replace(*post_payload, payload, payload_length);
- *post_payload_size = payload_length;
+ // parse the content type
+ const char *ct = strcasestr(begin, "Content-Type: ");
+ if(ct) {
+ ct = &ct[14];
+ while (*ct && isspace(*ct)) ct++;
+ const char *space = ct;
+ while (*space && !isspace(*space) && *space != ';') space++;
+ size_t ct_len = space - ct;
+
+ char ct_copy[ct_len + 1];
+ memcpy(ct_copy, ct, ct_len);
+ ct_copy[ct_len] = '\0';
+
+ (*post_payload)->content_type = content_type_string2id(ct_copy);
}
+ else
+ (*post_payload)->content_type = CT_TEXT_PLAIN;
+
return true;
}
diff --git a/libnetdata/url/url.h b/src/libnetdata/url/url.h
index 9db018f0b..f7a67dd5c 100644
--- a/libnetdata/url/url.h
+++ b/src/libnetdata/url/url.h
@@ -25,7 +25,7 @@ char *url_decode(char *str);
char *url_decode_r(char *to, const char *url, size_t size);
-bool url_is_request_complete(char *begin, char *end, size_t length, char **post_payload, size_t *post_payload_length);
+bool url_is_request_complete_and_extract_payload(const char *begin, const char *end, size_t length, BUFFER **post_payload);
char *url_find_protocol(char *s);
#endif /* NETDATA_URL_H */