Check 50 returns a lot of errors https://sandbox.cs50.net/checks/caefd03d8ac2485b820743724297b846 My load function /** * Loads a file into memory dynamically allocated on heap. * Stores address thereof in *content and length thereof in *length. */ bool load(FILE* file, BYTE** content, size_t* length) { if(file == NULL) { return false; } //Allocate memory on heap BYTE* buffer = malloc(sizeof(BYTE)*500); *content = NULL; int count = 0; size_t c; //Read characters from file while((c = fgetc(file)) != EOF) { if( count%500 == 0) { buffer = (BYTE* )realloc(buffer, sizeof(BYTE)*(500 +count)); } buffer[count] = c; count++; } *content = buffer; *length = count; return true; } My indexes function /** * Checks, in order, whether index.php or index.html exists inside of path. * Returns path to first match if so, else NULL. */ char* indexes(const char* path) { char* php = "index.php"; char* html = "index.html"; char* path2 = (char* )malloc(sizeof(strlen(php) + strlen(html) + 1)); strcpy(path2,path); if(strcmp(&path2[strlen(path) - 1],"/") != 0) { strcat(path2, "/"); } //concatenate "index.php" to the path and check if it exists strcat(path2,php); if(strstr(path2,php) != NULL) { if(access(path2,F_OK) != -1) { free(path2); return path2; } } //Concatenate "index.html" to the path and check if it exists else { strcat(path2,html); if(strstr(path2,html) != NULL) { if(access(path2,F_OK) != -1) { free(path2); return path2; } } else { return NULL; } } return path2; } My parse and lookup function(Got it corrected through check50 test 1) /** * Returns MIME type for supported extensions, else NULL. */ const char* lookup(const char* path) { // http://www.tutorialspoint.com/c_standard_library/c_function_strchr.htm const char ch = '.'; //Stores string after the . char* end = strchr(path,ch); //Initialize string for storing the return value char* ret; //Check the file extension if(strcasecmp(end,"css") == 0) { ret = "text/css"; return ret; } if(strcasecmp(end,"html") == 0) { ret = "text/html"; return ret; } if(strcasecmp(end,"gif") == 0) { ret = "image/gif"; return ret; } if(strcasecmp(end,"ico") == 0) { ret = "image/x-icon"; return ret; } if(strcasecmp(end,"jpg") == 0) { ret = "image/jpeg"; return ret; } if(strcasecmp(end,"js") == 0) { ret = "text/javascript"; return ret; } if(strcasecmp(end,"php") == 0) { ret = "text/x-php"; return ret; } if(strcasecmp(end,"png") == 0) { ret = "image/png"; return ret; } else return NULL; } /** * Parses a request-line, storing its absolute-path at abs_path * and its query string at query, both of which are assumed * to be at least of length LimitRequestLine + 1. */ bool parse(const char* line, char* abs_path, char* query) { // TODO /* Request-line consists of method SP request-target SP HTTP-version CRLF*/ //The request target consists of the absolute path and the query in this form : absolute-path [ "?" query ] //We will use strtok to store tokens in different strings //Referenced from stackoverflow and tutorialspoint.com //Copy the line into a new string char *l = strdup(line); //Token to store method char* method = strtok(l, " "); //Token to store request target char *request = strtok(NULL," "); //Store the HTTP version in a token char* http = strtok(NULL,"\r\n "); //Store the absolute path in a token char* abs_path1 = strtok(request,"?"); //Store the query after ? in a token char* query1 = strtok(NULL,"?"); if(query1 == NULL) query1 = ""; strcpy(query,query1); strcpy(abs_path,abs_path1); if (strcmp(method, "GET") != 0) { error(405); return false; } if (strchr(query, '"')) { error(400); return false; } if (request[0] != '/') { error(501); return false; } if (strstr(request, "/ ") != 0) { error(404); return false; } if (strcmp(http, "HTTP/1.1") != 0) { error(505); return false; } return true; }