simple http request (temperature data) from mbed lpc1768 with application board to thingsboard device/dashboard

Dependencies:   LM75B mbed-http

Fork of http-example by sandbox

Committer:
Jan Jongboom
Date:
Thu Feb 16 11:13:40 2017 +0100
Revision:
1:3bff14db67c7
Add mbed-http

Who changed what in which revision?

UserRevisionLine numberNew 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_