#include <stdlib.h>
#include <string.h>
-
-static const char http_html_hdr_200[] = "HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n";
-static const char http_html_hdr_404[] = "HTTP/1.0 404 Not Found\r\nContent-type: text/html\r\n\r\n";
-static const char http_html_hdr_500[] = "HTTP/1.0 500 Internal Server Error\r\nContent-type: text/html\r\n\r\n";
+static struct { const char *key; const char *content; } http_content_type[] =
+{
+ {"", "Content-type: application/json\r\n\r\n"},
+ {"htm", "Content-type: text/html\r\n\r\n"},
+ {"css", "Content-type: text/css\r\n\r\n"},
+ {"js", "Content-type: text/javascript\r\n\r\n"},
+ {"png", "Content-type: image/png\r\n\r\n"},
+ {"jpg", "Content-type: image/jpeg\r\n\r\n"},
+ {"gif", "Content-type: image/gif\r\n\r\n"},
+ {"txt", "Content-type: text/plain\r\n\r\n"},
+};
+
+static const char http_html_hdr_200[] = "HTTP/1.0 200 OK\r\n";
+static const char http_html_hdr_404[] = "HTTP/1.0 404 Not Found\r\n";
+static const char http_html_hdr_500[] = "HTTP/1.0 500 Internal Server Error\r\n";
static HttpCGI *cgi_table;
static http_handler_t http_callback;
return NULL;
}
+int http_searchContentType(const char *name)
+{
+ if (!name)
+ return 0;
+
+ const char *ext = get_ext(name);
+ LOG_INFO("Ext: %s\n", !ext ? "none" : ext);
+
+ if (!ext)
+ return 0;
+
+ if (!strcmp(ext, "ico"))
+ return HTTP_CONTENT_JPEG;
+
+ for (int i = 0; i < HTTP_CONTENT_CNT; i++)
+ {
+ if (!strcmp(ext, http_content_type[i].key))
+ return i;
+ }
+
+ return 0;
+}
+
/**
* Send on \param client socket
* the 200 Ok http header
*/
-void http_sendOk(struct netconn *client)
+void http_sendOk(struct netconn *client, int content_type)
{
- netconn_write(client, http_html_hdr_200, sizeof(http_html_hdr_200) - 1, NETCONN_NOCOPY);
+ ASSERT(content_type < HTTP_CONTENT_CNT);
+
+ netconn_write(client, http_html_hdr_200, sizeof(http_html_hdr_200) - 1, NETCONN_COPY);
+ netconn_write(client, http_content_type[content_type].content,
+ strlen(http_content_type[content_type].content), NETCONN_COPY);
}
* Send on \param client socket
* the 404 File not found http header
*/
-void http_sendFileNotFound(struct netconn *client)
+void http_sendFileNotFound(struct netconn *client, int content_type)
{
- netconn_write(client, http_html_hdr_404, sizeof(http_html_hdr_404) - 1, NETCONN_NOCOPY);
+ ASSERT(content_type < HTTP_CONTENT_CNT);
+
+ netconn_write(client, http_html_hdr_404, sizeof(http_html_hdr_404) - 1, NETCONN_COPY);
+ netconn_write(client, http_content_type[content_type].content,
+ strlen(http_content_type[content_type].content), NETCONN_COPY);
}
/**
* Send on \param client socket
* the 500 internal server error http header
*/
-void http_sendInternalErr(struct netconn *client)
+void http_sendInternalErr(struct netconn *client, int content_type)
{
- netconn_write(client, http_html_hdr_500, sizeof(http_html_hdr_500) - 1, NETCONN_NOCOPY);
+ ASSERT(content_type < HTTP_CONTENT_CNT);
+
+ netconn_write(client, http_html_hdr_500, sizeof(http_html_hdr_500) - 1, NETCONN_COPY);
+ netconn_write(client, http_content_type[content_type].content,
+ strlen(http_content_type[content_type].content), NETCONN_COPY);
}
static http_handler_t cgi_search(const char *name, HttpCGI *table)
int i = 0;
const char *ext = get_ext(name);
- LOG_INFO("EXT %s\n", ext ? "none" : ext);
+
while(table[i].name)
{
if (ext && table[i].type == CGI_MATCH_EXT)
{
- LOG_INFO("Match all ext %s\n", ext);
+
if (!strcmp(table[i].name, ext))
+ {
+ LOG_INFO("Match all ext %s\n", ext);
break;
+ }
}
else if (table[i].type == CGI_MATCH_NAME)
{
- LOG_INFO("Match all name %s\n", name);
+
if (strstr(name, table[i].name) != NULL)
+ {
+ LOG_INFO("Match all name %s\n", name);
break;
+ }
}
else /* (table[i].type == CGI_MATCH_WORD) */
{
- LOG_INFO("Match all word %s\n", name);
+
if (!strcmp(table[i].name, name))
+ {
+ LOG_INFO("Match all word %s\n", name);
break;
+ }
}
i++;
if (cgi(client, req_string, rx_buf, len) < 0)
{
LOG_ERR("Internal server error\n");
- http_sendInternalErr(client);
+ http_sendInternalErr(client, HTTP_CONTENT_HTML);
netconn_write(client, http_server_error, http_server_error_len - 1, NETCONN_NOCOPY);
}
}
http_handler_t handler; ///< Callback to process the special request
} HttpCGI;
+enum
+{
+ HTTP_CONTENT_JSON = 0,
+ HTTP_CONTENT_HTML,
+ HTTP_CONTENT_CSS,
+ HTTP_CONTENT_JS,
+ HTTP_CONTENT_PNG,
+ HTTP_CONTENT_JPEG,
+ HTTP_CONTENT_GIF,
+ HTTP_CONTENT_PLAIN,
+
+ HTTP_CONTENT_CNT
+};
+
#define CGI_MATCH_NONE 0
#define CGI_MATCH_WORD 1 ///< Select item in table only if string match
#define CGI_MATCH_EXT 2 ///< Select item in table if the extention match
int http_tokenizeGetRequest(char *raw_buf, size_t raw_len);
void http_getPageName(const char *recv_buf, size_t recv_len, char *page_name, size_t len);
void http_decodeUrl(const char *raw_buf, size_t raw_len, char *decodec_buf, size_t len);
+int http_searchContentType(const char *name);
-void http_sendOk(struct netconn *client);
-void http_sendFileNotFound(struct netconn *client);
-void http_sendInternalErr(struct netconn *client);
+void http_sendOk(struct netconn *client, int content_type);
+void http_sendFileNotFound(struct netconn *client, int content_type);
+void http_sendInternalErr(struct netconn *client, int content_type);
void http_poll(struct netconn *server);
void http_init(http_handler_t default_callback, struct HttpCGI *table);