#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; }