static Response *staticHandler(Request *req) { ROUTE(req, "/static/"); // EXIT ON SHENANIGANS if (strstr(req->uri, "../")) return NULL; char *filename = req->uri + 1; // EXIT ON DIRS struct stat sbuff; if (stat(filename, &sbuff) < 0 || S_ISDIR(sbuff.st_mode)) return NULL; // EXIT ON NOT FOUND FILE *file = fopen(filename, "r"); if (!file) return NULL; // GET LENGTH char *buff; char lens[25]; size_t len; fseek(file, 0, SEEK_END); len = ftell(file); sprintf(lens, "%ld", (long int) len); rewind(file); // SET BODY Response *response = responseNew(); buff = malloc(sizeof(char) * len); fread(buff, sizeof(char), len, file); responseSetBody(response, bsNewLen(buff, len)); fclose(file); free(buff); // MIME TYPE char *mimeType = "text/plain"; len = bsGetLen(req->uri); if (!strncmp(req->uri + len - 4, "html", 4)) mimeType = "text/html"; else if (!strncmp(req->uri + len - 4, "json", 4)) mimeType = "application/json"; else if (!strncmp(req->uri + len - 4, "jpeg", 4)) mimeType = "image/jpeg"; else if (!strncmp(req->uri + len - 3, "jpg", 3)) mimeType = "image/jpeg"; else if (!strncmp(req->uri + len - 3, "gif", 3)) mimeType = "image/gif"; else if (!strncmp(req->uri + len - 3, "png", 3)) mimeType = "image/png"; else if (!strncmp(req->uri + len - 3, "css", 3)) mimeType = "text/css"; else if (!strncmp(req->uri + len - 2, "js", 2)) mimeType = "application/javascript"; // RESPOND responseSetStatus(response, OK); responseAddHeader(response, "Content-Type", mimeType); responseAddHeader(response, "Content-Length", lens); responseAddHeader(response, "Cache-Control", "max-age=2592000"); return response; }
Request *requestNew(char *buff) { Request *request = malloc(sizeof(Request)); char *segment, *bs; request->method = UNKNOWN_METHOD; request->path = NULL; request->uri = NULL; request->queryString = NULL; request->postBody = NULL; request->headers = NULL; request->cookies = NULL; request->account = NULL; // METHOD TOK(buff, " \t"); if (strcmp(segment, "OPTIONS") == 0) request->method = OPTIONS; else if (strcmp(segment, "GET") == 0) request->method = GET; else if (strcmp(segment, "HEAD") == 0) request->method = HEAD; else if (strcmp(segment, "POST") == 0) request->method = POST; else if (strcmp(segment, "PUT") == 0) request->method = PUT; else if (strcmp(segment, "DELETE") == 0) request->method = DELETE; else if (strcmp(segment, "TRACE") == 0) request->method = TRACE; else if (strcmp(segment, "CONNECT") == 0) request->method = CONNECT; else goto fail; // PATH TOK(NULL, " \t"); request->path = bsNew(segment); request->uri = bsNew(segment); if (strchr(request->path, '#') != NULL) goto fail; // VERSION TOK(NULL, "\n"); if (strncmp(segment, "HTTP/1.0", 8) != 0 && strncmp(segment, "HTTP/1.1", 8) != 0) goto fail; // HEADERS request->headers = parseHeaders(segment); // BODY bs = kvFindList(request->headers, "Content-Type"); if (bs != NULL && strncmp(bs, "application/x-www-form-urlencoded", 33) == 0) { segment = strtok(NULL, "\0"); if (segment == NULL) goto fail; request->postBody = parseQS(segment); } // QUERYSTRING segment = strchr(request->path, '?'); if (segment != NULL) { request->uri = bsNewLen(request->path, segment - request->path); request->queryString = parseQS(segment + 1); if (request->queryString == NULL) goto fail; } // COOKIES segment = kvFindList(request->headers, "Cookie"); if (segment != NULL) { request->cookies = parseCookies(segment); if (request->cookies == NULL) goto fail; } return request; fail: requestDel(request); return NULL; }