Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: RPC_HTTP RPC_HTTP_WIZnetInterface RPC_HTTP rpc_over_http_TL_interrupter_gatePJ
Fork of HTTPServer by
Revision 12:ba81cc117fb6, committed 2013-06-05
- Comitter:
- leihen
- Date:
- Wed Jun 05 23:39:24 2013 +0000
- Parent:
- 11:3943841e1798
- Child:
- 13:aa5338a5e452
- Commit message:
- Improved throughput of data.
; fixed incorrect Header handling.
; Fixed Support for other FileSystem Handler
Changed in this revision
--- a/HTTPRequestHandler.cpp Sun Jun 02 22:59:51 2013 +0000
+++ b/HTTPRequestHandler.cpp Wed Jun 05 23:39:24 2013 +0000
@@ -1,6 +1,7 @@
/* HTTPRequestHandler.cpp */
#include "mbed.h"
#include "HTTPRequestHandler.h"
+#include <ctype.h>
#define _DEBUG 0
@@ -20,21 +21,72 @@
const char hdrDNT[] = "DNT: 1\r\n";
const char hdrMaxAge[] = "MaxAge: 0\r\n";
const char hdrConClose[] = "Connection: Keep-Alive\r\n";
+//const char hdrTrsfrEnc[] = "Transfer-Encoding: Chunked\r\n";
const char hdrContent[] = "Content-Type: text/html\r\n";
const char hdrServer[] = "Server: mbed embedded\r\n";
const char hdrEndl[] = "\r\n";
+
+static int _stricmp(const char* a, const char* b)
+{
+ int la = strlen(a);
+ int lb = strlen(b);
+ for (int i = 0 ; i < min(la, lb) ; i++) {
+ if (tolower((int)a[i]) != tolower((int)b[i]))
+ return i;
+ }
+ return 0;
+}
+
+
+static const struct mapping_t {
+ const char* key;
+ const char* value;
+} fileTypeMapping[] = {
+ {".gif", "Content-Type: image/gif\r\n" },
+ {".jpg", "Content-Type: image/jpeg\r\n" },
+ {".jpeg","Content-Type: image/jpeg\r\n" },
+ {".ico", "Content-Type: image/x-icon\r\n"},
+ {".png", "Content-Type: image/png\r\n" },
+ {".zip", "Content-Type: image/zip\r\n" },
+ {".gz", "Content-Type: image/gz\r\n" },
+ {".tar", "Content-Type: image/tar\r\n" },
+ {".txt", "Content-Type: plain/text\r\n" },
+ {".pdf", "Content-Type: application/pdf\r\n" },
+ {".htm", "Content-Type: text/html\r\n" },
+ {".html","Content-Type: text/html\r\n" }};
+
HTTPRequestHandler::HTTPRequestHandler(HTTPConnection::HTTPMessage& Msg, TCPSocketConnection& Tcp)
: msg(Msg), tcp(Tcp)
{
msg = Msg;
tcp = Tcp;
+
}
HTTPRequestHandler::~HTTPRequestHandler()
{
}
+void HTTPRequestHandler::getStandardHeaders(HTTPHeaders& header, const char* fext)
+{
+ header.clear();
+ header["DNT"] = "1";
+ header["MaxAge"] = "0";
+ header["Connection"] = "Keep-Alive";
+ header["Server"] = "mbed Embedded";
+ if (fext == NULL)
+ header["Content-Type"] = "text/html";
+ else {
+ for (int i = 0 ; i < sizeof(fileTypeMapping)/sizeof(struct mapping_t) ;i++) {
+ if (_stricmp(fileTypeMapping[i].key, fext) == 0) {
+ header["Content-Type"] = fileTypeMapping[i].value;
+ break;
+ }
+ }
+ }
+}
+
void HTTPRequestHandler::handleRequest()
{
int err = 0;
@@ -107,6 +159,7 @@
tcp.send_all((char*)hdrDNT, strlen(hdrDNT));
tcp.send_all((char*)hdrMaxAge, strlen(hdrMaxAge));
tcp.send_all((char*)hdrContent, strlen(hdrContent));
+// tcp.send_all((char*)hdrTrsfrEnc, strlen(hdrTrsfrEnc));
tcp.send_all((char*)hdrServer, strlen(hdrServer));
tcp.send_all((char*)hdrEndl, strlen(hdrEndl));
}
--- a/HTTPRequestHandler.h Sun Jun 02 22:59:51 2013 +0000
+++ b/HTTPRequestHandler.h Wed Jun 05 23:39:24 2013 +0000
@@ -132,6 +132,8 @@
/** Handler function to serve POST requests. Send data to webserver. Can also be appended to uri.
*/
virtual int handlePostRequest() = 0;
+
+ void getStandardHeaders(HTTPHeaders& header, const char* fext = NULL);
};
#endif // __HTTPREQUESTHANDLER_H__
\ No newline at end of file
--- a/HTTPServer.cpp Sun Jun 02 22:59:51 2013 +0000
+++ b/HTTPServer.cpp Wed Jun 05 23:39:24 2013 +0000
@@ -164,7 +164,7 @@
if (c == 0) {
// Handle the request
HandleRequest(con.m_Msg, Clnt);
- INFO("Closing connection.\n");
+// INFO("Closing connection.\n");
// if (!m_wifly.close()) {
// ERR("Failed to close connection !\n");
// }
--- a/Handler/FsHandler.cpp Sun Jun 02 22:59:51 2013 +0000
+++ b/Handler/FsHandler.cpp Wed Jun 05 23:39:24 2013 +0000
@@ -16,9 +16,17 @@
#endif
-#define MAX_BUFFERSIZE 512
-static char buffer[MAX_BUFFERSIZE];
+static int matchstrings(const char* one, const char* two)
+{
+ int m = 0;
+
+ for (m = 0; m < min(strlen(one), strlen(two)) ; m++) {
+ if (one[m] != two[m])
+ return m;
+ }
+ return m;
+}
std::map<const char*, const char*> HTTPFsRequestHandler::m_fsMap;
@@ -28,16 +36,29 @@
m_rootPath = rootPath;
m_localPath = localPath;
+ string myPath = m_rootPath + m_localPath;
+
// Now replace the virtual root path with a mounted device path
std::map<const char*, const char*>::iterator it;
+ const char *bestMatch = NULL;
+ const char *bestMatchExchange = NULL;
+ int match_ind = -1;
for (it = m_fsMap.begin() ; it != m_fsMap.end() ; it++) {
// find best match (if the given logical path is containted in the root
- if (m_rootPath.find( it->second ) == 0) {
- m_rootPath = it->first;
- break;
+ int s = matchstrings(myPath.c_str(), it->second);
+ INFO("Matching Root %s with handler %s results in %d identical characters\n", myPath.c_str(), it->second, s);
+ if ((s == strlen(it->second)) && (s > match_ind)) {
+ match_ind = s;
+ bestMatch = it->first;
+ bestMatchExchange = it->second;
}
}
-
+
+ if (bestMatch != NULL) {
+ m_rootPath = bestMatch;
+ m_localPath = string(myPath).substr(strlen(bestMatchExchange));
+ }
+
handleRequest();
}
@@ -47,7 +68,14 @@
int HTTPFsRequestHandler::handleGetRequest()
{
- INFO("Handling Get Request.");
+ HTTPHeaders headers;
+
+ if (m_localPath.length() > 4)
+ getStandardHeaders(headers, m_localPath.substr(m_localPath.length()-4).c_str());
+ else
+ getStandardHeaders(headers);
+
+ INFO("Handling Get Request (root = %s, local = %s).", m_rootPath.c_str(), m_localPath.c_str());
int retval = 0; //success
std::string reqPath;
@@ -63,6 +91,15 @@
FILE *fp = fopen(reqPath.c_str(), "r");
if (fp != NULL) {
+ char * pBuffer = NULL;
+ int sz = 8192;
+ while( pBuffer == NULL) {
+ sz /= 2;
+ pBuffer = (char*)malloc(sz);
+ if (sz < 128)
+ error ("OutOfMemory");
+ }
+
// File was found and can be returned
// first determine the size
@@ -72,11 +109,12 @@
startResponse(200, size);
while(!feof(fp) && !ferror(fp)) {
- int cnt = fread(buffer, 1, MAX_BUFFERSIZE , fp);
+ int cnt = fread(pBuffer, 1, sz , fp);
if (cnt < 0)
cnt = 0;
- processResponse(cnt, buffer);
+ processResponse(cnt, pBuffer);
}
+ delete pBuffer;
endResponse();
fclose(fp);
}
