diff --git a/readme.md b/readme.md index 1d82c79..9da189a 100644 --- a/readme.md +++ b/readme.md @@ -10,6 +10,9 @@ I also plan to publish this as a portfolio project for my resume. ## TODO List - [x] Get basic HTTP interaction working - [x] Get url parsing working +- [x] Fix existing bugs in socket handling and TCP buffering +- [ ] Finish code to parse HTTP requests +- [ ] Finish code to build HTTP responses - [ ] Get file serving working - [ ] Create basic templating engine for HTML working - [ ] Get POST requests working diff --git a/request_handler.c b/request_handler.c index a9f5cfb..c0244ca 100644 --- a/request_handler.c +++ b/request_handler.c @@ -1,93 +1,108 @@ - #include "request_handler.h" void handle_request(char* request, int length, char* response, size_t* response_length) { - request[length] = '\0'; // Null terminate request for printing + // Terminate request with EOF so strtok stops at end of string + request[length] = EOF; printf("Request ---------\n"); printf("%s\n---------\n", request); - // Check if request is GET - char* ptr = request; // Modifiable pointer to request - char buf_temp[10]; // Temporary buffer to store request code - char* ptr_temp = - (char*)&buf_temp; // Modifiable pointer to temporary buffer - // Copy request code to temporary buffer - while (*ptr != ' ') { - *ptr_temp = *ptr; - ptr++; - ptr_temp++; - } - // Null terminate temporary buffer - *ptr_temp = '\0'; - ptr++; // Skip over space - if (strcmp(buf_temp, "GET") == 0) { - printf("Received a GET request!!\n"); - } else { - printf("Received a non-GET request!!\n"); - return; + // Parse request into struct + http_request req; + char* lines[100]; + int num_lines = 0; + char* tok = strtok(request, "\n"); + + while (tok != NULL) { + printf("%s\n", tok); + tok = strtok(NULL, "\n"); } - // Get filename from request url - char filename[100]; // Buffer to store filename - ptr_temp = (char*)&filename; // Modifiable pointer to filename - *ptr_temp = '.'; // Prepend . to filename - ptr_temp++; - // While loop to copy filename to temporary buffer - while (*ptr != ' ') { - // Convert %20 to space - if (*ptr == '%' && *(ptr + 1) == '2' && *(ptr + 2) == '0') { - ptr += 3; - *ptr_temp = ' '; - ptr_temp++; - } else { - // Copy character - *ptr_temp = *ptr; - ptr++; - ptr_temp++; - } - } - *ptr_temp = '\0'; // Null terminate filename + // printf("tok is %s\n", tok); - // Print filename - printf("Filename: %s\n", filename); + // // Check if request is GET + // char* ptr = request; // Modifiable pointer to request + // char buf_temp[10]; // Temporary buffer to store request code + // char* ptr_temp = + // (char*)&buf_temp; // Modifiable pointer to temporary buffer + // // Copy request code to temporary buffer + // while (*ptr != ' ') { + // *ptr_temp = *ptr; + // ptr++; + // ptr_temp++; + // } + // // Null terminate temporary buffer + // *ptr_temp = '\0'; + // ptr++; // Skip over space + // if (strcmp(buf_temp, "GET") == 0) { + // printf("Received a GET request!!\n"); + // } else { + // printf("Received a non-GET request!!\n"); + // return; + // } + + // // Get filename from request url + // char filename[100]; // Buffer to store filename + // ptr_temp = (char*)&filename; // Modifiable pointer to filename + // *ptr_temp = '.'; // Prepend . to filename + // ptr_temp++; + // // While loop to copy filename to temporary buffer + // while (*ptr != ' ') { + // // Convert %20 to space + // if (*ptr == '%' && *(ptr + 1) == '2' && *(ptr + 2) == '0') { + // ptr += 3; + // *ptr_temp = ' '; + // ptr_temp++; + // } else { + // // Copy character + // *ptr_temp = *ptr; + // ptr++; + // ptr_temp++; + // } + // } + // *ptr_temp = '\0'; // Null terminate filename + + // // Print filename + // printf("Filename: %s\n", filename); // Create reponse string - ptr_temp = response; + char* ptr_temp = response; char* temp = - "HTTP/1.1 200 OK\r\nContent-Type: text/html \r\nContent-Length: "; - while (*temp != '\0') { - *ptr_temp = *temp; - ptr_temp++; - temp++; - } - // Put content length in the html response - int content_length = strlen(filename); - char content_length_str[10]; - sprintf(content_length_str, "%d", content_length); - temp = (char*)&content_length_str; - while (*temp != '\0') { - *ptr_temp = *temp; - ptr_temp++; - temp++; - } - // Terminate header - temp = "\r\n\r\n\0"; - while (*temp != '\0') { - *ptr_temp = *temp; - ptr_temp++; - temp++; - } - // Put the filename in the html response - temp = filename; - while (*temp != '\0') { - *ptr_temp = *temp; - ptr_temp++; - temp++; - } + "HTTP/1.1 200 OK\r\nContent-Type: text/html \r\nContent-Length: " + "0\r\n\r\n\0"; + strcpy(ptr_temp, temp); + // while (*temp != '\0') { + // *ptr_temp = *temp; + // ptr_temp++; + // temp++; + // } + // // Put content length in the html response + // int content_length = strlen(filename); + // char content_length_str[10]; + // sprintf(content_length_str, "%d", content_length); + // temp = (char*)&content_length_str; + // while (*temp != '\0') { + // *ptr_temp = *temp; + // ptr_temp++; + // temp++; + // } + // // Terminate header + // temp = "\r\n\r\n\0"; + // while (*temp != '\0') { + // *ptr_temp = *temp; + // ptr_temp++; + // temp++; + // } + // // Put the filename in the html response + // temp = filename; + // while (*temp != '\0') { + // *ptr_temp = *temp; + // ptr_temp++; + // temp++; + // } - *ptr_temp = '\0'; // Null terminate response + // *ptr_temp = '\0'; // Null terminate response printf("Response --------\n"); printf("%s\n--------\n", response); diff --git a/request_handler.h b/request_handler.h index 3f8e10a..346ed01 100644 --- a/request_handler.h +++ b/request_handler.h @@ -1,10 +1,30 @@ -#ifndef HTTP_RESPONSE_BUILDER_H -#define HTTP_RESPONSE_BUILDER_H +#ifndef REQUEST_HANDLER_H +#define REQUEST_HANDLER_H #include #include #include +struct http_request { + char* method; + char* url; + char** headers; + int num_headers; + char* body; + size_t body_length; +}; + +struct http_response { + char* status_line; + char** headers; + int num_headers; + char* body; + size_t body_length; +}; + +typedef struct http_request http_request; +typedef struct http_response http_response; + void handle_request(char* request, int length, char* response, size_t* response_length);