I am so frustrated by pset6, so much unfamiliar stuff here...... please help! I have written all the 4 to-do functions, however if I go to the web server, no matter what I clicked, it shows no more than < ?. Except the cat.exe shows error 500 in stead of 501. It should return 501, I cant figure out why 500 here. It seems a lot goes wrong. **So I go to gdb**, setting the breakpoint at main, and find out the server.c falls into the line if(connected()) and does not show anything anymore. I am confused because by if(connected()), it has not yet touched any of the 4 functions I wrote, there shouldn't be anything wrong....supposedly? I really need advice, thanks! Here are lookup and load: /** * 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) { // bsic settings int counter = 0; char* buffer = malloc(2); memset(buffer, '\0', 2); * content = malloc(1); // Realloc *content to the size needed. while (fread(buffer, 1, 1, file) == 1) { counter = counter + 1; } free(buffer); * content = realloc (* content, counter + 1); memset(*content, '\0', counter + 1); // Read and store all the bytes to *content. memcpy(* content, buffer, counter); if (* content == NULL) { return false; } * length = strlen(* content) + 1; if (length == NULL) { return false; } return true; } const char* lookup(const char* path) { // To return MIME types char* MIME_type = strrchr(path, '.'); char buffer[strlen(MIME_type) + 1]; memset(buffer, '\0', strlen(MIME_type) + 1); strcpy(buffer, MIME_type); if (strcasecmp(buffer, ".css")) return "text/css"; else if (strcasecmp(buffer, ".html")) return "text/html"; else if (strcasecmp(buffer, ".gif")) return "image/gif"; else if (strcasecmp(buffer, ".ico")) return "image/x-icon"; else if (strcasecmp(buffer, ".jpg")) return "image/jpg"; else if(strcasecmp(buffer, ".js")) return "text/javascript"; else if(strcasecmp(buffer, ".php")) return "text/x-php"; else if(strcasecmp(buffer, ".png")) return "image/png"; else return NULL; } Here is parse: bool parse(const char* line, char* abs_path, char* query) { // Initialize abs_path and query. memset(abs_path, '\0', LimitRequestLine + 1); memset(query, '\0', LimitRequestLine + 1); // Find where /,? and space are. char* first_space = strchr(line, ' '); char* question_mark = strchr(line, '?'); char* HTTP_version = strstr(line, "HTTP"); char* target_end = HTTP_version - 1; // Extract absolute-path and query. if (question_mark == NULL) { memcpy(abs_path, (first_space + 1), target_end - (first_space + 1)); } else { memcpy(abs_path, (first_space + 1), question_mark - (first_space + 1)); memcpy(query, (question_mark + 1), target_end - (question_mark + 1)); } // Check line's consistency with the rules. // find substrings in line. // for testing but FAIL************************ if (strncmp((first_space + 1), "/cat.exe", 8) == 0) { error(500); return false; } char* get = strstr(line, "GET "); if (get == NULL || get != line) { error(405); return false; } if(strstr(line, " ") != NULL) { error(400); return false; } if (strncmp(HTTP_version, "HTTP/1.1", 8) != 0) { error(505); return false; } char* quotation = strchr(line, '"'); if(first_space < quotation && quotation < target_end) { error(400); return false; } if (* (first_space + 1) != '/') { error(501); return false; } return true; } and indexes: char* indexes(const char* path) { // return if index.php is present. char* indexphp = "/index.php"; char* path_php = malloc(strlen(path) + strlen(indexphp) + 1); memset(path_php, '\0', strlen(path) + strlen(indexphp) + 1); strcpy(path_php, path); strcat(path_php, indexphp); if (access(path_php, F_OK) == 0) { return path_php; } else { char* indexhtml = "/index.html"; char* path_html = malloc(strlen(path) + strlen(indexhtml) + 1); memset(path_html, '\0', strlen(path) + strlen(indexhtml) + 1); strcpy(path_html, path); strcat(path_html, indexhtml); if (access(path_html, F_OK) == 0) { return path_html; } else return NULL; } }