#include #include #include #include #include #include "const.h" #ifdef ENABLE_MODULE #include "modules/modules.h" #endif int parseInfo (char *pattern, char *buffersrc, char *bufferdst, char fin) { char *ptr; int i; ptr = strstr (buffersrc, (pattern)); if (ptr == NULL) return 0; else { ptr += strlen (pattern); // if (bufferdst[0] != '\0') memset (bufferdst, 0, MAX_BUFFER); for (i = 0; i < MAX_BUFFER; i++) { if (*(ptr + i) == (fin) || *(ptr + i) == ('\0')) break; bufferdst[i] = *(ptr + i); } } return 1; } int ParseGet (char *buffersrc, char *bufferdst, int *protocole) { char *ptr; int parsed = parseInfo ("GET ", buffersrc, bufferdst, ' '); if (bufferdst[0] == '\0') strcpy (bufferdst, "/"); ptr = strstr (buffersrc, "HTTP/1.1"); if (ptr == NULL) *protocole = 0; else *protocole = 1; #ifdef DEBUG printf ("Get (HTTP/1.%d) : %s\n", *protocole, bufferdst); #endif return parsed; } int ParseUserAgent (char *buffersrc, char *bufferdst) { memset (bufferdst, 0, strlen (bufferdst)); int parsed = parseInfo ("User-Agent: ", buffersrc, bufferdst, '\n'); if (bufferdst[(strlen (bufferdst) - 1)] == '\r') bufferdst[(strlen (bufferdst) - 1)] = '\0'; if (bufferdst[strlen (bufferdst)] == '\n') bufferdst[strlen (bufferdst)] = '\0'; #ifdef DEBUG printf ("User-Agent : %s\n", bufferdst); #endif return parsed; } int ParseTransferEncoding (char *buffersrc, char *bufferdst) { memset (bufferdst, 0, strlen (bufferdst)); int parsed = parseInfo ("Transfer-Encoding: ", buffersrc, bufferdst, '\n'); #ifdef DEBUG if (bufferdst[0] != '\0') printf ("Transfer-Encoding: %s\n", bufferdst); #endif return parsed; } int ParseHost (char *buffersrc, char *bufferdst, unsigned short * PROXY_URL_SIZE) { char buffer[MAX_BUFFER]; char *ptr; int parsed; parsed = parseInfo ("Host: ", buffersrc, bufferdst, '\n'); memset (buffer, 0, MAX_BUFFER); ptr = strstr (bufferdst, PROXY_URL); if (ptr == NULL) { printf ("Url invalide !\n"); return 0; } else if(*PROXY_URL_SIZE > MAX_BUFFER) { printf ("Url trop longue !\n"); return 0; } switch (bufferdst[strlen (bufferdst)]) { case '\n': if (bufferdst[(strlen (bufferdst) - 1)] == '\r') strncpy (buffer, bufferdst, (strlen (bufferdst) - (*PROXY_URL_SIZE + 4))); else strncpy (buffer, bufferdst, (strlen (bufferdst) - (*PROXY_URL_SIZE + 3))); break; case '/': strncpy (buffer, bufferdst, (strlen (bufferdst) - (*PROXY_URL_SIZE + 3))); break; case '\r': strncpy (buffer, bufferdst, (strlen (bufferdst) - (*PROXY_URL_SIZE + 3))); break; default: strncpy (buffer, bufferdst, (strlen (bufferdst) - (*PROXY_URL_SIZE + 4))); break; } memset (bufferdst, 0, MAX_BUFFER); strncpy (bufferdst, buffer, strlen(buffer)); #ifdef DEBUG printf ("Host : %s\n", bufferdst); #endif return parsed; } int ParseConnection (char *buffersrc, char *bufferdst) { int parsed = parseInfo ("Connection: ", buffersrc, bufferdst, '\n'); if (bufferdst[(strlen (bufferdst) - 1)] == '\r') bufferdst[(strlen (bufferdst) - 1)] = '\0'; #ifdef DEBUG printf ("Connection : %s\n", bufferdst); #endif return parsed; } int ParseKeepAlive (char *buffersrc, int *timeout) { char bufferdst[MAX_BUFFER]; int parsed = parseInfo ("Keep-Alive: ", buffersrc, bufferdst, '\n'); if (bufferdst[(strlen (bufferdst) - 1)] == '\r') bufferdst[(strlen (bufferdst) - 1)] = '\0'; if (bufferdst[strlen (bufferdst)] == '\n') bufferdst[strlen (bufferdst)] = '\0'; *timeout = strtoul (bufferdst, '\0', 10); #ifdef DEBUG printf ("Keep-Alive : %d\n", *timeout); #endif return parsed; } int ParseContentLenght (char *buffersrc, int *content_lenght) { char *ptr; int i; char bufferdst[MAX_BUFFER]; ptr = strstr (buffersrc, "Content-Length: "); if (ptr == NULL) return 0; else { ptr += strlen ("Content-Length: "); memset (bufferdst, 0, MAX_BUFFER); for (i = 0; i < MAX_BUFFER; i++) { if (*(ptr + i) == '\n') break; else if (*(ptr + i) == ' ') break; else if (*(ptr + i) == ';') break; bufferdst[i] = *(ptr + i); } } *content_lenght = strtoul(bufferdst, '\0', 10); #ifdef DEBUG printf ("Content-Lenght : %d\n", atoi (bufferdst)); #endif return 1; } int ParseContentType (char *buffersrc, char *bufferdst) { char *ptr; int parsed; ptr = strchr (buffersrc, ';'); if (ptr == NULL) { parsed = parseInfo ("Content-Type: ", buffersrc, bufferdst, '\n'); if (bufferdst[(strlen (bufferdst) - 1)] == '\r') bufferdst[(strlen (bufferdst) - 1)] = '\0'; } else parsed = parseInfo ("Content-Type: ", buffersrc, bufferdst, ';'); #ifdef DEBUG if (bufferdst[0] != '\0') printf ("Content-Type : %s\n", bufferdst); #endif return parsed; }