#ifndef _HTTPD_H___ #define _HTTPD_H___ #include #include // Client request extern char *method, // "GET" or "POST" *uri, // "/index.html" things before '?' *qs, // "a=1&b=2" things after '?' *prot, // "HTTP/1.1" *payload; // for POST extern int payload_size; // Server control functions void serve_forever(const char *PORT); char *request_header(const char *name); typedef struct { char *name, *value; } header_t; static header_t reqhdr[17] = {{"\0", "\0"}}; header_t *request_headers(void); // user shall implement this function void route(); // Response #define RESPONSE_PROTOCOL "HTTP/1.1" #define HTTP_200 printf("%s 200 OK\n\n", RESPONSE_PROTOCOL) #define HTTP_201 printf("%s 201 Created\n\n", RESPONSE_PROTOCOL) #define HTTP_404 printf("%s 404 Not found\n\n", RESPONSE_PROTOCOL) #define HTTP_500 printf("%s 500 Internal Server Error\n\n", RESPONSE_PROTOCOL) #define HTTP_301 printf("%s 301 Moved Permanently\n\n", RESPONSE_PROTOCOL) // some interesting macro for `route()` #define ROUTE_START() if (0) { #define ROUTE(METHOD, URI) \ } \ else if (strcmp(URI, uri) == 0 && strcmp(METHOD, method) == 0) { #define GET(URI) ROUTE("GET", URI) #define POST(URI) ROUTE("POST", URI) #define ROUTE_END() \ } \ else HTTP_500; #endif