fix superfluous \r\n after body
Fork of mbed-http by
README.md@15:ffc77f212382, 2017-07-28 (annotated)
- Committer:
- Jan Jongboom
- Date:
- Fri Jul 28 14:26:26 2017 +0200
- Revision:
- 15:ffc77f212382
- Parent:
- 12:530c2ebee349
- Child:
- 19:a5371b71de6f
Add request parsing to prepare for HTTP server example
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Jan Jongboom |
0:910f5949759f | 1 | # HTTP and HTTPS library for mbed OS 5 |
Jan Jongboom |
0:910f5949759f | 2 | |
Jan Jongboom |
0:910f5949759f | 3 | This library is used to make HTTP and HTTPS calls from mbed OS 5 applications. |
Jan Jongboom |
0:910f5949759f | 4 | |
Jan Jongboom |
0:910f5949759f | 5 | ## HTTP Request API |
Jan Jongboom |
0:910f5949759f | 6 | |
Jan Jongboom |
0:910f5949759f | 7 | ```cpp |
Jan Jongboom |
0:910f5949759f | 8 | NetworkInterface* network = /* obtain a NetworkInterface object */ |
Jan Jongboom |
0:910f5949759f | 9 | |
Jan Jongboom |
0:910f5949759f | 10 | const char body[] = "{\"hello\":\"world\"}"; |
Jan Jongboom |
0:910f5949759f | 11 | |
Jan Jongboom |
5:2456c90f02e9 | 12 | HttpRequest* request = new HttpRequest(network, HTTP_POST, "http://httpbin.org/post"); |
Jan Jongboom |
5:2456c90f02e9 | 13 | request->set_header("Content-Type", "application/json"); |
Jan Jongboom |
5:2456c90f02e9 | 14 | HttpResponse* response = request->send(body, strlen(body)); |
Jan Jongboom |
0:910f5949759f | 15 | // if response is NULL, check response->get_error() |
Jan Jongboom |
0:910f5949759f | 16 | |
Jan Jongboom |
0:910f5949759f | 17 | printf("status is %d - %s\n", response->get_status_code(), response->get_status_message()); |
Jan Jongboom |
5:2456c90f02e9 | 18 | printf("body is:\n%s\n", response->get_body_as_string().c_str()); |
Jan Jongboom |
5:2456c90f02e9 | 19 | |
Jan Jongboom |
5:2456c90f02e9 | 20 | delete request; // also clears out the response |
Jan Jongboom |
0:910f5949759f | 21 | ``` |
Jan Jongboom |
0:910f5949759f | 22 | |
Jan Jongboom |
0:910f5949759f | 23 | ## HTTPS Request API |
Jan Jongboom |
0:910f5949759f | 24 | |
Jan Jongboom |
0:910f5949759f | 25 | ```cpp |
Jan Jongboom |
0:910f5949759f | 26 | // pass in the root certificates that you trust, there is no central CA registry in mbed OS |
Jan Jongboom |
0:910f5949759f | 27 | const char SSL_CA_PEM[] = "-----BEGIN CERTIFICATE-----\n" |
Jan Jongboom |
0:910f5949759f | 28 | /* rest of the CA root certificates */; |
Jan Jongboom |
0:910f5949759f | 29 | |
Jan Jongboom |
0:910f5949759f | 30 | NetworkInterface* network = /* obtain a NetworkInterface object */ |
Jan Jongboom |
0:910f5949759f | 31 | |
Jan Jongboom |
0:910f5949759f | 32 | const char body[] = "{\"hello\":\"world\"}"; |
Jan Jongboom |
0:910f5949759f | 33 | |
Jan Jongboom |
5:2456c90f02e9 | 34 | HttpsRequest* request = new HttpsRequest(network, SSL_CA_PEM, HTTP_GET "https://httpbin.org/status/418"); |
Jan Jongboom |
5:2456c90f02e9 | 35 | HttpResponse* response = request->send(); |
Jan Jongboom |
0:910f5949759f | 36 | // if response is NULL, check response->get_error() |
Jan Jongboom |
0:910f5949759f | 37 | |
Jan Jongboom |
0:910f5949759f | 38 | printf("status is %d - %s\n", response->get_status_code(), response->get_status_message()); |
Jan Jongboom |
0:910f5949759f | 39 | printf("body is:\n%s\n", response->get_body().c_str()); |
Jan Jongboom |
5:2456c90f02e9 | 40 | |
Jan Jongboom |
5:2456c90f02e9 | 41 | delete request; |
Jan Jongboom |
0:910f5949759f | 42 | ``` |
Jan Jongboom |
0:910f5949759f | 43 | |
Jan Jongboom |
0:910f5949759f | 44 | ## Dealing with large body |
Jan Jongboom |
0:910f5949759f | 45 | |
Jan Jongboom |
5:2456c90f02e9 | 46 | By default the library will store the full request body on the heap. This works well for small responses, but you'll run out of memory when receiving a large response body. To mitigate this you can pass in a callback as the last argument to the request constructor. This callback will be called whenever a chunk of the body is received. You can set the request chunk size in the `HTTP_RECEIVE_BUFFER_SIZE` macro (see `mbed_lib.json` for the definition) although it also depends on the buffer size of the underlying network connection. |
Jan Jongboom |
0:910f5949759f | 47 | |
Jan Jongboom |
0:910f5949759f | 48 | ```cpp |
Jan Jongboom |
0:910f5949759f | 49 | void body_callback(const char* data, size_t data_len) { |
Jan Jongboom |
0:910f5949759f | 50 | // do something with the data |
Jan Jongboom |
0:910f5949759f | 51 | } |
Jan Jongboom |
0:910f5949759f | 52 | |
Jan Jongboom |
5:2456c90f02e9 | 53 | HttpRequest* req = new HttpRequest(network, HTTP_GET, "http://pathtolargefile.com"); |
Jan Jongboom |
5:2456c90f02e9 | 54 | req->send(NULL, 0, body_callback); |
Jan Jongboom |
0:910f5949759f | 55 | ``` |
Jan Jongboom |
0:910f5949759f | 56 | |
Jan Jongboom |
12:530c2ebee349 | 57 | ## Socket re-use |
Jan Jongboom |
12:530c2ebee349 | 58 | |
Jan Jongboom |
12:530c2ebee349 | 59 | By default the library opens a new socket per request. This is wasteful, especially when dealing with TLS requests. You can re-use sockets like this: |
Jan Jongboom |
12:530c2ebee349 | 60 | |
Jan Jongboom |
12:530c2ebee349 | 61 | ### HTTP |
Jan Jongboom |
12:530c2ebee349 | 62 | |
Jan Jongboom |
12:530c2ebee349 | 63 | ```cpp |
Jan Jongboom |
12:530c2ebee349 | 64 | TCPSocket* socket = new TCPSocket(); |
Jan Jongboom |
12:530c2ebee349 | 65 | |
Jan Jongboom |
12:530c2ebee349 | 66 | nsapi_error_t open_result = socket->open(network); |
Jan Jongboom |
12:530c2ebee349 | 67 | // check open_result |
Jan Jongboom |
12:530c2ebee349 | 68 | |
Jan Jongboom |
12:530c2ebee349 | 69 | nsapi_error_t connect_result = socket->connect("httpbin.org", 80); |
Jan Jongboom |
12:530c2ebee349 | 70 | // check connect_result |
Jan Jongboom |
12:530c2ebee349 | 71 | |
Jan Jongboom |
12:530c2ebee349 | 72 | // Pass in `socket`, instead of `network` as first argument |
Jan Jongboom |
12:530c2ebee349 | 73 | HttpRequest* req = new HttpRequest(socket, HTTP_GET, "http://httpbin.org/status/418"); |
Jan Jongboom |
12:530c2ebee349 | 74 | ``` |
Jan Jongboom |
12:530c2ebee349 | 75 | |
Jan Jongboom |
12:530c2ebee349 | 76 | ### HTTPS |
Jan Jongboom |
12:530c2ebee349 | 77 | |
Jan Jongboom |
12:530c2ebee349 | 78 | ```cpp |
Jan Jongboom |
12:530c2ebee349 | 79 | TLSSocket* socket = new TLSSocket(network, "httpbin.org", 443, SSL_CA_PEM); |
Jan Jongboom |
12:530c2ebee349 | 80 | socket->set_debug(true); |
Jan Jongboom |
12:530c2ebee349 | 81 | if (socket->connect() != 0) { |
Jan Jongboom |
12:530c2ebee349 | 82 | printf("TLS Connect failed %d\n", socket->error()); |
Jan Jongboom |
12:530c2ebee349 | 83 | return 1; |
Jan Jongboom |
12:530c2ebee349 | 84 | } |
Jan Jongboom |
12:530c2ebee349 | 85 | |
Jan Jongboom |
12:530c2ebee349 | 86 | // Pass in `socket`, instead of `network` as first argument, and omit the `SSL_CA_PEM` argument |
Jan Jongboom |
12:530c2ebee349 | 87 | HttpsRequest* get_req = new HttpsRequest(socket, HTTP_GET, "https://httpbin.org/status/418"); |
Jan Jongboom |
12:530c2ebee349 | 88 | ``` |
Jan Jongboom |
12:530c2ebee349 | 89 | |
Jan Jongboom |
0:910f5949759f | 90 | ## Tested on |
Jan Jongboom |
0:910f5949759f | 91 | |
Jan Jongboom |
0:910f5949759f | 92 | * K64F with Ethernet. |
Jan Jongboom |
0:910f5949759f | 93 | * NUCLEO_F411RE with ESP8266. |