summaryrefslogtreecommitdiffstats
path: root/libnetdata/url
diff options
context:
space:
mode:
authorthiagoftsm <49162938+thiagoftsm@users.noreply.github.com>2019-06-06 17:01:39 +0000
committerGitHub <noreply@github.com>2019-06-06 17:01:39 +0000
commit58b7d95a7ec9c576f8a06bbab07f755846b5349a (patch)
treef17e30963170e818bbe55ed32843eea71de7ac29 /libnetdata/url
parent7039044be96ee82058768d98865b992b100a294a (diff)
New URL parser (#6070)
* URL_parser 3 * URL_parser rebase 2! * URL_parameter parsing 3 * URL_parameter parsing 4 * URL_parameter parsing 5 * URL_parser alarms * URL_parser finish the basic structure * URL_parser codacity fixes! * URL_parser scripts! * URL_parser codacy! * URL_parser rebase 3! * URL_parser host fixes! * URL_parser host fixes 2! * URL_parser fix spaces! * URL_parser error message! * URL_parser Christopher requests! * URL_parser alarms fixed! * URL_parser health fixed! * URL_parser rebase 4! * URL_parser C fix write format! * URL_parser fix bugs due cache!
Diffstat (limited to 'libnetdata/url')
-rw-r--r--libnetdata/url/url.c85
-rw-r--r--libnetdata/url/url.h22
2 files changed, 107 insertions, 0 deletions
diff --git a/libnetdata/url/url.c b/libnetdata/url/url.c
index 07a9f8069e..fb1fb7f07a 100644
--- a/libnetdata/url/url.c
+++ b/libnetdata/url/url.c
@@ -79,3 +79,88 @@ char *url_decode_r(char *to, char *url, size_t size) {
return to;
}
+
+inline HTTP_VALIDATION url_is_request_complete(char *begin,char *end,size_t length) {
+ if ( begin == end) {
+ return HTTP_VALIDATION_INCOMPLETE;
+ }
+
+ if ( length > 3 ) {
+ begin = end - 4;
+ }
+
+ uint32_t counter = 0;
+ do {
+ if (*begin == '\r') {
+ begin++;
+ if ( begin == end )
+ {
+ break;
+ }
+
+ if (*begin == '\n')
+ {
+ counter++;
+ }
+ } else if (*begin == '\n') {
+ begin++;
+ counter++;
+ }
+
+ if ( counter == 2) {
+ break;
+ }
+ }
+ while (begin != end);
+
+ return (counter == 2)?HTTP_VALIDATION_OK:HTTP_VALIDATION_INCOMPLETE;
+}
+
+inline char *url_find_protocol(char *s) {
+ while(*s) {
+ // find the next space
+ while (*s && *s != ' ') s++;
+
+ // is it SPACE + "HTTP/" ?
+ if(*s && !strncmp(s, " HTTP/", 6)) break;
+ else s++;
+ }
+
+ return s;
+}
+
+int url_parse_query_string(struct web_fields *names,struct web_fields *values,char *moveme,char *divisor) {
+ uint32_t i = 0;
+ uint32_t max = WEB_FIELDS_MAX;
+
+ do {
+ if ( i == max) {
+ error("We are exceeding the maximum number of elements possible(%u) in this query string(%s)",max,moveme);
+ break;
+ }
+ if (divisor) {
+ names[i].body = moveme;
+ names[i].length = divisor - moveme;//= - begin
+
+ moveme = ++divisor; //value
+ values[i].body = moveme;
+
+ (void)divisor;
+ divisor = strchr(moveme,'&'); //end of value
+ if (divisor) {
+ values[i].length = (size_t )(divisor - moveme);
+ } else{
+ values[i].length = strlen(moveme);
+ break;
+ }
+
+ moveme = divisor;
+ divisor = strchr(++moveme,'='); //end of value
+ i++;
+ } else {
+ break;
+ }
+ } while (moveme);
+
+ return ++i;
+}
diff --git a/libnetdata/url/url.h b/libnetdata/url/url.h
index 6cef6d7a84..9e86c20cfd 100644
--- a/libnetdata/url/url.h
+++ b/libnetdata/url/url.h
@@ -25,4 +25,26 @@ extern char *url_decode(char *str);
extern char *url_decode_r(char *to, char *url, size_t size);
+#define WEB_FIELDS_MAX 200
+struct web_fields{
+ char *body;
+ size_t length;
+};
+// http_request_validate()
+// returns:
+// = 0 : all good, process the request
+// > 0 : request is not supported
+// < 0 : request is incomplete - wait for more data
+
+typedef enum {
+ HTTP_VALIDATION_OK,
+ HTTP_VALIDATION_NOT_SUPPORTED,
+ HTTP_VALIDATION_INCOMPLETE,
+ HTTP_VALIDATION_REDIRECT
+} HTTP_VALIDATION;
+
+extern HTTP_VALIDATION url_is_request_complete(char *begin,char *end,size_t length);
+extern char *url_find_protocol(char *s);
+extern int url_parse_query_string(struct web_fields *names,struct web_fields *values,char *moveme,char *divisor);
+
#endif /* NETDATA_URL_H */