From 3e42da279c793794cf2e7ff71ad0e756362e03c5 Mon Sep 17 00:00:00 2001 From: Jordan Bancino Date: Wed, 8 Mar 2023 01:54:33 +0000 Subject: [PATCH] Make improvements to HttpClient, add Uri --- src/HttpClient.c | 27 +++++++++++++-- src/Uri.c | 73 ++++++++++++++++++++++++++++++++++++++++ src/include/HttpClient.h | 2 +- src/include/Uri.h | 45 +++++++++++++++++++++++++ 4 files changed, 143 insertions(+), 4 deletions(-) create mode 100644 src/Uri.c create mode 100644 src/include/Uri.h diff --git a/src/HttpClient.c b/src/HttpClient.c index c6ca49f..8d239b1 100644 --- a/src/HttpClient.c +++ b/src/HttpClient.c @@ -44,7 +44,7 @@ struct HttpClientContext }; HttpClientContext * -HttpRequest(HttpRequestMethod method, int flags, char *host, char *path, char *port) +HttpRequest(HttpRequestMethod method, int flags, unsigned short port, char *host, char *path) { HttpClientContext *context; @@ -52,11 +52,31 @@ HttpRequest(HttpRequestMethod method, int flags, char *host, char *path, char *p struct addrinfo hints, *res, *res0; int error; + char serv[8]; + if (!method || !host || !path) { return NULL; } + if (!port) + { + if (flags & HTTP_TLS) + { + strcpy(serv, "https"); + } + else + { + strcpy(serv, "www"); + } + } + else + { + sprintf(serv, "%hu", port); + } + + printf("serv = %s\n", serv); + /* TODO: Not supported yet */ if (flags & HTTP_TLS) { @@ -72,7 +92,7 @@ HttpRequest(HttpRequestMethod method, int flags, char *host, char *path, char *p memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; - error = getaddrinfo(host, port, &hints, &res0); + error = getaddrinfo(host, serv, &hints, &res0); if (error) { @@ -116,11 +136,12 @@ HttpRequest(HttpRequestMethod method, int flags, char *host, char *path, char *p return NULL; } - fprintf(context->stream, "%s %s HTTP/1.0\r\n", + fprintf(context->stream, "%s %s HTTP/1.1\r\n", HttpRequestMethodToString(method), path); HttpRequestHeader(context, "Connection", "close"); HttpRequestHeader(context, "User-Agent", "Telodendria/" TELODENDRIA_VERSION); + HttpRequestHeader(context, "Host", host); return context; } diff --git a/src/Uri.c b/src/Uri.c new file mode 100644 index 0000000..e18f990 --- /dev/null +++ b/src/Uri.c @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2022-2023 Jordan Bancino <@jordan:bancino.net> + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#include + +#include +#include + +#include + +Uri * +UriParse(const char *str) +{ + Uri *uri; + int res; + + if (!str) + { + return NULL; + } + + uri = Malloc(sizeof(Uri)); + if (!uri) + { + return NULL; + } + + memset(uri, 0, sizeof(Uri)); + + res = sscanf(str, "%7[^:]://%127[^:]:%hu%255[^\n]", uri->proto, uri->host, &uri->port, uri->path) == 4 + || sscanf(str, "%7[^:]://%127[^/]%255[^\n]", uri->proto, uri->host, uri->path) == 3 + || sscanf(str, "%7[^:]://%127[^:]%hu[^\n]", uri->proto, uri->host, &uri->port) == 3 + || sscanf(str, "%7[^:]://%127[^\n]", uri->proto, uri->host) == 2; + + if (!res) + { + Free(uri); + return NULL; + } + + if (!uri->path[0]) + { + strcpy(uri->path, "/"); + } + + return uri; +} + +void +UriFree(Uri * uri) +{ + Free(uri); +} diff --git a/src/include/HttpClient.h b/src/include/HttpClient.h index c99679b..03b6ad2 100644 --- a/src/include/HttpClient.h +++ b/src/include/HttpClient.h @@ -35,7 +35,7 @@ typedef struct HttpClientContext HttpClientContext; extern HttpClientContext * - HttpRequest(HttpRequestMethod, int, char *, char *, char *); + HttpRequest(HttpRequestMethod, int, unsigned short, char *, char *); extern void HttpRequestHeader(HttpClientContext *, char *, char *); diff --git a/src/include/Uri.h b/src/include/Uri.h new file mode 100644 index 0000000..414c652 --- /dev/null +++ b/src/include/Uri.h @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2022-2023 Jordan Bancino <@jordan:bancino.net> + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#ifndef TELODENDRIA_URI_H +#define TELODENDRIA_URI_H + +#define URI_PROTO_MAX 8 +#define URI_HOST_MAX 128 +#define URI_PATH_MAX 256 + +typedef struct Uri +{ + char proto[URI_PROTO_MAX]; + char host[URI_HOST_MAX]; + char path[URI_PATH_MAX]; + unsigned short port; +} Uri; + +extern Uri * + UriParse(const char *); + +extern void + UriFree(Uri *); + +#endif /* TELODENDRIA_URI_H */