ENTS-tock
Environmental NeTworked Sensor firmware on Tock OS
Loading...
Searching...
No Matches
http.cpp
Go to the documentation of this file.
1#include "http.hpp"
2
3#include <Arduino.h>
4
5#include <algorithm>
6#include <sstream>
7
9
10HttpClient::HttpClient(const std::string& resp) {
11 // find indicies of data
12 size_t header_start = resp.find(LINE_END);
13 size_t data_start = resp.find(LINE_END + LINE_END);
14 size_t header_end = data_start - header_start;
15 std::string status_substr = resp.substr(0, header_start);
16 ExtractText(&status_substr);
17 DecodeStatus(status_substr);
18
19 std::string headers_substr = resp.substr(header_start, header_end);
20 ExtractText(&headers_substr);
21 DecodeHeaders(headers_substr);
22
23 data = resp.substr(data_start);
24 ExtractText(&data);
25}
26
28
29std::string HttpClient::Version() { return version; }
30
31unsigned int HttpClient::ResponseCode() { return code; }
32
33std::string HttpClient::Header(std::string header) { return headers[header]; }
34
35std::string HttpClient::Data() { return data; }
36
37void HttpClient::DecodeStatus(std::string status_str) {
38 std::stringstream status_stream(status_str);
39 status_stream >> version >> code;
40}
41
42void HttpClient::DecodeHeaders(std::string headers_str) {
43 std::istringstream header_stream(headers_str);
44
45 for (std::string line; std::getline(header_stream, line, '\n');) {
46 std::size_t pos = line.find(':');
47 std::string key = line.substr(0, pos);
48 ExtractText(&key);
49 std::string val = line.substr(pos + 1);
50 ExtractText(&val);
51 headers[key] = val;
52 }
53}
54
55void HttpClient::RemoveLeadingSpace(std::string* str) {
56 // get first printable character
57 auto end = std::find_if(str->begin(), str->end(),
58 [](char c) { return !isSpace(c); });
59
60 if (str->begin() != end) {
61 // remove whitespace
62 str->erase(
63 std::remove_if(str->begin(), end, [](char c) { return isSpace(c); }),
64 end);
65 }
66}
67
68void HttpClient::RemoveTrailingSpace(std::string* str) {
69 // reverse string
70 std::reverse(str->begin(), str->end());
71
72 // get iterator to first non-space character
73 auto rend = std::find_if(str->begin(), str->end(),
74 [](char c) { return !isSpace(c); });
75
76 // no whitespace found
77 if (str->begin() != rend) {
78 // remove whitespace
79 str->erase(
80 std::remove_if(str->begin(), rend, [](char c) { return isSpace(c); }),
81 rend);
82 }
83
84 // restore to original order
85 std::reverse(str->begin(), str->end());
86}
87
88void HttpClient::ExtractText(std::string* str) {
89 RemoveLeadingSpace(str);
90 RemoveTrailingSpace(str);
91}
92
93void HttpClient::RemoveSpace(std::string* str) {
94 // remove whitespace
95 str->erase(std::remove_if(str->begin(), str->end(),
96 [](char c) { return isSpace(c); }),
97 str->end());
98}
HttpClient()
Default constructor.
Definition http.cpp:8
~HttpClient()
Default destructor.
Definition http.cpp:27
std::string Version()
Get the Http version.
Definition http.cpp:29
unsigned int ResponseCode()
Get the http response code.
Definition http.cpp:31
std::string Header(std::string header)
Get value of header.
Definition http.cpp:33
std::string Data()
Get data from Http request.
Definition http.cpp:35