Begin library for gemini requests
This commit is contained in:
commit
18ee823f95
|
@ -0,0 +1,94 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
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;
|
||||
}
|
Loading…
Reference in New Issue