#include "http.h" #include #include #include #include #include #include const char * method_str[] = { [METHOD_GET] = "GET", [METHOD_HEAD] = "HEAD", [METHOD_POST] = "POST", [METHOD_PUT] = "PUT", [METHOD_DELETE] = "DELETE", [METHOD_OPTIONS] = "OPTIONS", [METHOD_PATCH] = "PATCH", }; const char * status_str[] = { [STATUS_OK] = "200 OK", [STATUS_BAD_REQUEST] = "400 Bad Request", [STATUS_METHOD_NOT_ALLOWED] = "405 Method Not Allowed", [STATUS_REQUEST_TIMEOUT] = "408 Request Timeout", [STATUS_INTERNAL_SERVER_ERROR] = "500 Internal Server Error", [STATUS_NOT_IMPLEMENTED] = "501 Not Implemented", [STATUS_VERSION_NOT_SUPPORTED] = "505 Version Not Supported", }; /// Sends a simple response only with a status to the client. /// \param fd File descriptor of the client socket /// \param status HTTP response status code /// \return Negative value if an error was encountered; numbers of bytes written otherwise int respond_only_status(const int fd, const enum status status) { static const char * pattern = "HTTP/1.1 %s\r\n" "Connection: close\r\n" "\r\n"; return dprintf(fd, pattern, status_str[status]); } /// Sends a response with a status and a body to the client. /// \param fd File descriptor of the client socket /// \param status HTTP response status code /// \param body Content that will be sent /// \return Negative value if an error was encountered; numbers of bytes written otherwise int respond_with_body(const int fd, const enum status status, const char * body) { static const char * pattern = "HTTP/1.1 %s\r\n" "Connection: close\r\n" "Content-Type: text/plain\r\n" "\r\n"; if (0 > dprintf(fd, pattern, status_str[status])) { return -1; // TODO: Handle errors properly } return send(fd, body, strlen(body), 0); } /// /// \param fd /// \param request /// \return int parse_request(const int fd, struct request * const request) { char buffer[10240]; int length = recv(fd, buffer, 10240, 0); if (-1 == length && EWOULDBLOCK != errno && EAGAIN != errno) { return -1; } if (0 == length) { return -1; // TODO: Handle errors properly } request->body = malloc(length + 1); memcpy(request->body, buffer, length); request->body[length] = 0; return length; }