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: HTTP-RPCServerExample
Fork of HTTPServer by
Diff: HTTPConnection.cpp
- Revision:
- 4:d065642c32cc
- Parent:
- 3:d6224049b3bf
- Child:
- 6:fe661fa9d18a
diff -r d6224049b3bf -r d065642c32cc HTTPConnection.cpp
--- a/HTTPConnection.cpp Tue May 28 01:56:14 2013 +0000
+++ b/HTTPConnection.cpp Tue May 28 21:20:58 2013 +0000
@@ -20,6 +20,20 @@
+const struct HTTPRequestConfig {
+ const char* request_string;
+ HTTPRequestType request_type;
+} g_requestConfig[] = {
+ { "GET", HTTP_RT_GET },
+ { "POST", HTTP_RT_POST},
+ { "PUT", HTTP_RT_PUT},
+ { "OPTIONS",HTTP_RT_OPTIONS},
+ { "HEAD", HTTP_RT_HEAD},
+ { "DELETE", HTTP_RT_DELETE},
+ { "TRACE", HTTP_RT_TRACE},
+ { "CONNECT",HTTP_RT_CONNECT}
+};
+
HTTPConnection::HTTPConnection()
{
@@ -136,14 +150,16 @@
int HTTPConnection::parse(char* buffer)
{
+ // Check if buffer is invalid or its content not long enough.
if ((buffer == NULL) || (strlen(buffer) < 4)) {
ERR("Buffer content is invalid or too short.");
return -1;
}
- vector<std::string> args;
+ std::vector<std::string> args;
args.clear();
+ int argno = 0;
// decompose string into a list of arguments
char s = 0; // current starting char
int nLen = strlen(buffer)+1;
@@ -151,25 +167,25 @@
if ((buffer[i] == ' ') || (buffer[i] == '\n') || (buffer[i] == 0)) {
// new arg found
buffer[i] = 0;
+ if (argno++ == 1) {
+ // its the uri
+ // parse the uri args
+ parseUriArgs(&buffer[s], m_Msg.args);
+ }
INFO("Found argument \"%s\"", &buffer[s]);
args.push_back(&buffer[s]);
s = i+1;
}
}
-
- if (args.at(0) == "GET") {
- m_Msg.request = HTTP_RT_GET;
- m_Msg.uri = args[1];
- m_Msg.version = args[2];
- }
- else {
- if (args.at(0) == "POST") {
- m_Msg.request = HTTP_RT_GET;
- m_Msg.uri = args[1];
- m_Msg.version = args[2];
- }
- else {
- INFO("unhandled message.");
+
+ // store the uri and the HTTP version
+ m_Msg.uri = args[1];
+ m_Msg.version = args[2];
+
+ // Find matching request type
+ for (int i = 0 ; i < sizeof(g_requestConfig)/sizeof(struct HTTPRequestConfig) ; i++) {
+ if (args.at(0) == g_requestConfig[i].request_string) {
+ m_Msg.request = g_requestConfig[i].request_type;
}
}
args.clear();
@@ -180,6 +196,7 @@
int HTTPConnection::parseHeader(char *buffer)
{
+ // Check if the buffer is invalid or if the content is too short to be meaningful
if ((strlen(buffer) <3) || (buffer == NULL))
return -1;
@@ -201,3 +218,49 @@
ERR("Did not recieve a valid header : \"%s\".", buffer);
return -1;
}
+
+int HTTPConnection::parseUriArgs(char *buffer, map<string,string>&args)
+{
+ // Check if the buffer is invalid or if the content is too short to be meaningful
+ if ((strlen(buffer) <3) || (buffer == NULL))
+ return -1;
+
+ int args_start = -1;
+ int value_start = -1;
+ int buflen = strlen(buffer) +1;
+ const char* argname = NULL;
+ const char* valuename = NULL;
+ for (int i = 0; i < buflen ; i++) {
+ if (args_start == -1) { // args section not yet found
+ if (buffer[i] == '?') { // starts with a question mark, so got it
+ buffer[i] = 0;
+ args_start = i; // set the start of the args section
+ INFO("Argument section found !");
+ }
+ }
+ else { // search arg-value touples
+ if (argname == NULL) { // arg-name found ?
+ if (buffer[i] == '=') {
+ // yes, separate the arg-name
+ buffer[i] = 0;
+ argname = &buffer[args_start];
+ value_start = i+1;
+ INFO("Argument name %s", argname);
+ }
+ }
+ else { // search for end of value
+ if ((buffer[i] == '&') || (buffer[i] == 0) || (buffer[i] == '\r') || (buffer[i] == '\n')) {
+ buffer[i] = 0;
+ valuename = &buffer[value_start];
+ INFO("Argument value %s", valuename);
+ args[argname] = valuename;
+ // reset all indicators
+ argname = NULL;
+ valuename = NULL;
+ }
+ }
+ }
+ }
+
+ return 0;
+}
