From 18ee823f95bd526e52438077f1efa0b3e034105a Mon Sep 17 00:00:00 2001 From: Romain de Laage Date: Tue, 8 Dec 2020 15:58:50 +0100 Subject: [PATCH] Begin library for gemini requests --- gemini.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 gemini.c diff --git a/gemini.c b/gemini.c new file mode 100644 index 0000000..260966a --- /dev/null +++ b/gemini.c @@ -0,0 +1,94 @@ +#include +#include +#include +#include +#include + +typedef struct _gemini_request { + char request_content[1024]; + char hostname[256]; + char scheme[64]; + char path[1024]; + char answer_code[2]; + char answer_meta[2]; + char answer_content[8192]; +} Request; + +Request *examineRequest(const char *request_content) +{ + int i = 0, len = 0, len_req = strlen(request_content); + Request *request = malloc(sizeof(Request)); + + if (request == NULL) + return NULL; + + memset(request, 0, sizeof(Request)); + + strcpy(request->request_content, request_content); + + /* We are trying to determine the protocol */ + while (i <= len_req - 3) + if (request_content[i] != ':' || request_content[i + 1] != '/' || request_content[i + 2] != '/') + { + i++; + len++; + } + else + { + strncpy(request->scheme, request_content + i - len, len); + break; + } + + /* If no protocol found error */ + if (request->scheme[0] == 0) + { + free(request); + return NULL; + } + + /* We skip the :// */ + i += 3; + len = 0; + + /* We try to determine hostname + port */ + while (i < len_req && request_content[i] != '/') + { + i++; + len++; + } + + strncpy(request->hostname, request_content + i - len, len); + + /* if no hostname error */ + if (request->hostname[0] == 0) + { + free(request); + return NULL; + } + + /* now fill path in request struct */ + strncpy(request->path, request_content + i, strlen(request_content) - i); + + /* if path is empty, so path is root */ + if(request->path[0] == 0) + strcpy(request->path, "/"); + + return request; +} + +int main(void) +{ + Request *request = examineRequest("http://[5f1f:fgeg::1]"); + + if (request == NULL) + { + printf("error during url parsing\n"); + return 1; + } + + printf("Request : %s\nScheme : %s\nHostname : %s\n", request->request_content, request->scheme, request->hostname); + + free(request); + + return 0; +}