Just testing things, based off of http-example-wnc
Dependencies: easy-connect mbed-http
Fork of http-example-wnc by
source/mbed-http/http_request_builder.h@1:3bff14db67c7, 2017-02-16 (annotated)
- Committer:
- Jan Jongboom
- Date:
- Thu Feb 16 11:13:40 2017 +0100
- Revision:
- 1:3bff14db67c7
Add mbed-http
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| Jan Jongboom |
1:3bff14db67c7 | 1 | #ifndef _MBED_HTTP_REQUEST_BUILDER_H_ |
| Jan Jongboom |
1:3bff14db67c7 | 2 | #define _MBED_HTTP_REQUEST_BUILDER_H_ |
| Jan Jongboom |
1:3bff14db67c7 | 3 | |
| Jan Jongboom |
1:3bff14db67c7 | 4 | #include <string> |
| Jan Jongboom |
1:3bff14db67c7 | 5 | #include <map> |
| Jan Jongboom |
1:3bff14db67c7 | 6 | #include "http_parser.h" |
| Jan Jongboom |
1:3bff14db67c7 | 7 | #include "http_parsed_url.h" |
| Jan Jongboom |
1:3bff14db67c7 | 8 | |
| Jan Jongboom |
1:3bff14db67c7 | 9 | class HttpRequestBuilder { |
| Jan Jongboom |
1:3bff14db67c7 | 10 | public: |
| Jan Jongboom |
1:3bff14db67c7 | 11 | HttpRequestBuilder(http_method a_method, ParsedUrl* a_parsed_url) |
| Jan Jongboom |
1:3bff14db67c7 | 12 | : method(a_method), parsed_url(a_parsed_url) |
| Jan Jongboom |
1:3bff14db67c7 | 13 | { |
| Jan Jongboom |
1:3bff14db67c7 | 14 | set_header("Host", string(parsed_url->host())); |
| Jan Jongboom |
1:3bff14db67c7 | 15 | } |
| Jan Jongboom |
1:3bff14db67c7 | 16 | |
| Jan Jongboom |
1:3bff14db67c7 | 17 | /** |
| Jan Jongboom |
1:3bff14db67c7 | 18 | * Set a header for the request |
| Jan Jongboom |
1:3bff14db67c7 | 19 | * If the key already exists, it will be overwritten... |
| Jan Jongboom |
1:3bff14db67c7 | 20 | */ |
| Jan Jongboom |
1:3bff14db67c7 | 21 | void set_header(string key, string value) { |
| Jan Jongboom |
1:3bff14db67c7 | 22 | map<string, string>::iterator it = headers.find(key); |
| Jan Jongboom |
1:3bff14db67c7 | 23 | |
| Jan Jongboom |
1:3bff14db67c7 | 24 | if (it != headers.end()) { |
| Jan Jongboom |
1:3bff14db67c7 | 25 | it->second = value; |
| Jan Jongboom |
1:3bff14db67c7 | 26 | } |
| Jan Jongboom |
1:3bff14db67c7 | 27 | else { |
| Jan Jongboom |
1:3bff14db67c7 | 28 | headers.insert(headers.end(), pair<string, string>(key, value)); |
| Jan Jongboom |
1:3bff14db67c7 | 29 | } |
| Jan Jongboom |
1:3bff14db67c7 | 30 | } |
| Jan Jongboom |
1:3bff14db67c7 | 31 | |
| Jan Jongboom |
1:3bff14db67c7 | 32 | char* build(const void* body, size_t body_size) { |
| Jan Jongboom |
1:3bff14db67c7 | 33 | const char* method_str = http_method_str(method); |
| Jan Jongboom |
1:3bff14db67c7 | 34 | |
| Jan Jongboom |
1:3bff14db67c7 | 35 | if (body_size > 0) { |
| Jan Jongboom |
1:3bff14db67c7 | 36 | char buffer[10]; |
| Jan Jongboom |
1:3bff14db67c7 | 37 | snprintf(buffer, 10, "%d", body_size); |
| Jan Jongboom |
1:3bff14db67c7 | 38 | set_header("Content-Length", string(buffer)); |
| Jan Jongboom |
1:3bff14db67c7 | 39 | } |
| Jan Jongboom |
1:3bff14db67c7 | 40 | |
| Jan Jongboom |
1:3bff14db67c7 | 41 | size_t size = 0; |
| Jan Jongboom |
1:3bff14db67c7 | 42 | |
| Jan Jongboom |
1:3bff14db67c7 | 43 | // first line is METHOD PATH+QUERY HTTP/1.1\r\n |
| Jan Jongboom |
1:3bff14db67c7 | 44 | size += strlen(method_str) + 1 + strlen(parsed_url->path()) + strlen(parsed_url->query()) + 1 + 8 + 2; |
| Jan Jongboom |
1:3bff14db67c7 | 45 | |
| Jan Jongboom |
1:3bff14db67c7 | 46 | // after that we'll do the headers |
| Jan Jongboom |
1:3bff14db67c7 | 47 | typedef map<string, string>::iterator it_type; |
| Jan Jongboom |
1:3bff14db67c7 | 48 | for(it_type it = headers.begin(); it != headers.end(); it++) { |
| Jan Jongboom |
1:3bff14db67c7 | 49 | // line is KEY: VALUE\r\n |
| Jan Jongboom |
1:3bff14db67c7 | 50 | size += it->first.length() + 1 + 1 + it->second.length() + 2; |
| Jan Jongboom |
1:3bff14db67c7 | 51 | } |
| Jan Jongboom |
1:3bff14db67c7 | 52 | |
| Jan Jongboom |
1:3bff14db67c7 | 53 | // then the body, first an extra newline |
| Jan Jongboom |
1:3bff14db67c7 | 54 | size += 2; |
| Jan Jongboom |
1:3bff14db67c7 | 55 | |
| Jan Jongboom |
1:3bff14db67c7 | 56 | // body |
| Jan Jongboom |
1:3bff14db67c7 | 57 | size += body_size; |
| Jan Jongboom |
1:3bff14db67c7 | 58 | |
| Jan Jongboom |
1:3bff14db67c7 | 59 | // extra newline |
| Jan Jongboom |
1:3bff14db67c7 | 60 | size += 2; |
| Jan Jongboom |
1:3bff14db67c7 | 61 | |
| Jan Jongboom |
1:3bff14db67c7 | 62 | // Now let's print it |
| Jan Jongboom |
1:3bff14db67c7 | 63 | char* req = (char*)calloc(size + 1, 1); |
| Jan Jongboom |
1:3bff14db67c7 | 64 | char* originalReq = req; |
| Jan Jongboom |
1:3bff14db67c7 | 65 | |
| Jan Jongboom |
1:3bff14db67c7 | 66 | sprintf(req, "%s %s%s HTTP/1.1\r\n", method_str, parsed_url->path(), parsed_url->query()); |
| Jan Jongboom |
1:3bff14db67c7 | 67 | req += strlen(method_str) + 1 + strlen(parsed_url->path()) + strlen(parsed_url->query()) + 1 + 8 + 2; |
| Jan Jongboom |
1:3bff14db67c7 | 68 | |
| Jan Jongboom |
1:3bff14db67c7 | 69 | typedef map<string, string>::iterator it_type; |
| Jan Jongboom |
1:3bff14db67c7 | 70 | for(it_type it = headers.begin(); it != headers.end(); it++) { |
| Jan Jongboom |
1:3bff14db67c7 | 71 | // line is KEY: VALUE\r\n |
| Jan Jongboom |
1:3bff14db67c7 | 72 | sprintf(req, "%s: %s\r\n", it->first.c_str(), it->second.c_str()); |
| Jan Jongboom |
1:3bff14db67c7 | 73 | req += it->first.length() + 1 + 1 + it->second.length() + 2; |
| Jan Jongboom |
1:3bff14db67c7 | 74 | } |
| Jan Jongboom |
1:3bff14db67c7 | 75 | |
| Jan Jongboom |
1:3bff14db67c7 | 76 | sprintf(req, "\r\n"); |
| Jan Jongboom |
1:3bff14db67c7 | 77 | req += 2; |
| Jan Jongboom |
1:3bff14db67c7 | 78 | |
| Jan Jongboom |
1:3bff14db67c7 | 79 | if (body_size > 0) { |
| Jan Jongboom |
1:3bff14db67c7 | 80 | sprintf(req, "%s", (char*)body); |
| Jan Jongboom |
1:3bff14db67c7 | 81 | } |
| Jan Jongboom |
1:3bff14db67c7 | 82 | req += body_size; |
| Jan Jongboom |
1:3bff14db67c7 | 83 | |
| Jan Jongboom |
1:3bff14db67c7 | 84 | sprintf(req, "\r\n"); |
| Jan Jongboom |
1:3bff14db67c7 | 85 | req += 2; |
| Jan Jongboom |
1:3bff14db67c7 | 86 | |
| Jan Jongboom |
1:3bff14db67c7 | 87 | // Uncomment to debug... |
| Jan Jongboom |
1:3bff14db67c7 | 88 | // printf("----- BEGIN REQUEST -----\n"); |
| Jan Jongboom |
1:3bff14db67c7 | 89 | // printf("%s", originalReq); |
| Jan Jongboom |
1:3bff14db67c7 | 90 | // printf("----- END REQUEST -----\n"); |
| Jan Jongboom |
1:3bff14db67c7 | 91 | |
| Jan Jongboom |
1:3bff14db67c7 | 92 | return originalReq; |
| Jan Jongboom |
1:3bff14db67c7 | 93 | } |
| Jan Jongboom |
1:3bff14db67c7 | 94 | |
| Jan Jongboom |
1:3bff14db67c7 | 95 | private: |
| Jan Jongboom |
1:3bff14db67c7 | 96 | http_method method; |
| Jan Jongboom |
1:3bff14db67c7 | 97 | ParsedUrl* parsed_url; |
| Jan Jongboom |
1:3bff14db67c7 | 98 | map<string, string> headers; |
| Jan Jongboom |
1:3bff14db67c7 | 99 | }; |
| Jan Jongboom |
1:3bff14db67c7 | 100 | |
| Jan Jongboom |
1:3bff14db67c7 | 101 | #endif // _MBED_HTTP_REQUEST_BUILDER_H_ |
