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.
Fork of http-example by
source/main-https-chunked-request.cpp@29:5ad8f931e4ff, 2018-03-27 (annotated)
- Committer:
- Jan Jongboom
- Date:
- Tue Mar 27 11:57:33 2018 +0200
- Revision:
- 29:5ad8f931e4ff
- Parent:
- 25:a8be9f3a530c
Move serial baud rate config into mbed_app.json
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| Jan Jongboom |
25:a8be9f3a530c | 1 | /** |
| Jan Jongboom |
25:a8be9f3a530c | 2 | * This is an example of doing chunked requests, where you do not need to load the full request body |
| Jan Jongboom |
25:a8be9f3a530c | 3 | * into memory. You do this by adding a callback to the `send` function of the HTTP/HTTPS request. |
| Jan Jongboom |
25:a8be9f3a530c | 4 | */ |
| Jan Jongboom |
25:a8be9f3a530c | 5 | |
| Jan Jongboom |
25:a8be9f3a530c | 6 | #include "select-demo.h" |
| Jan Jongboom |
25:a8be9f3a530c | 7 | |
| Jan Jongboom |
25:a8be9f3a530c | 8 | #if DEMO == DEMO_HTTPS_CHUNKED_REQUEST |
| Jan Jongboom |
25:a8be9f3a530c | 9 | |
| Jan Jongboom |
25:a8be9f3a530c | 10 | #include "mbed.h" |
| Jan Jongboom |
25:a8be9f3a530c | 11 | #include "https_request.h" |
| Jan Jongboom |
25:a8be9f3a530c | 12 | #include "easy-connect.h" |
| Jan Jongboom |
25:a8be9f3a530c | 13 | |
| Jan Jongboom |
25:a8be9f3a530c | 14 | /* List of trusted root CA certificates |
| Jan Jongboom |
25:a8be9f3a530c | 15 | * currently one: Comodo, the CA for reqres.in |
| Jan Jongboom |
25:a8be9f3a530c | 16 | * |
| Jan Jongboom |
25:a8be9f3a530c | 17 | * To add more root certificates, just concatenate them. |
| Jan Jongboom |
25:a8be9f3a530c | 18 | */ |
| Jan Jongboom |
25:a8be9f3a530c | 19 | const char SSL_CA_PEM[] = "-----BEGIN CERTIFICATE-----\n" |
| Jan Jongboom |
25:a8be9f3a530c | 20 | "MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL\n" |
| Jan Jongboom |
25:a8be9f3a530c | 21 | "MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE\n" |
| Jan Jongboom |
25:a8be9f3a530c | 22 | "BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT\n" |
| Jan Jongboom |
25:a8be9f3a530c | 23 | "IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw\n" |
| Jan Jongboom |
25:a8be9f3a530c | 24 | "MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy\n" |
| Jan Jongboom |
25:a8be9f3a530c | 25 | "ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N\n" |
| Jan Jongboom |
25:a8be9f3a530c | 26 | "T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv\n" |
| Jan Jongboom |
25:a8be9f3a530c | 27 | "biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR\n" |
| Jan Jongboom |
25:a8be9f3a530c | 28 | "FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J\n" |
| Jan Jongboom |
25:a8be9f3a530c | 29 | "cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW\n" |
| Jan Jongboom |
25:a8be9f3a530c | 30 | "BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/\n" |
| Jan Jongboom |
25:a8be9f3a530c | 31 | "BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm\n" |
| Jan Jongboom |
25:a8be9f3a530c | 32 | "fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv\n" |
| Jan Jongboom |
25:a8be9f3a530c | 33 | "GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=\n" |
| Jan Jongboom |
25:a8be9f3a530c | 34 | "-----END CERTIFICATE-----\n"; |
| Jan Jongboom |
25:a8be9f3a530c | 35 | |
| Jan Jongboom |
25:a8be9f3a530c | 36 | void dump_response(HttpResponse* res) { |
| Jan Jongboom |
25:a8be9f3a530c | 37 | mbedtls_printf("Status: %d - %s\n", res->get_status_code(), res->get_status_message().c_str()); |
| Jan Jongboom |
25:a8be9f3a530c | 38 | |
| Jan Jongboom |
25:a8be9f3a530c | 39 | mbedtls_printf("Headers:\n"); |
| Jan Jongboom |
25:a8be9f3a530c | 40 | for (size_t ix = 0; ix < res->get_headers_length(); ix++) { |
| Jan Jongboom |
25:a8be9f3a530c | 41 | mbedtls_printf("\t%s: %s\n", res->get_headers_fields()[ix]->c_str(), res->get_headers_values()[ix]->c_str()); |
| Jan Jongboom |
25:a8be9f3a530c | 42 | } |
| Jan Jongboom |
25:a8be9f3a530c | 43 | mbedtls_printf("\nBody (%d bytes):\n\n%s\n", res->get_body_length(), res->get_body_as_string().c_str()); |
| Jan Jongboom |
25:a8be9f3a530c | 44 | } |
| Jan Jongboom |
25:a8be9f3a530c | 45 | |
| Jan Jongboom |
25:a8be9f3a530c | 46 | // Spread the message out over 3 different chunks |
| Jan Jongboom |
25:a8be9f3a530c | 47 | const char * chunks[] = { |
| Jan Jongboom |
25:a8be9f3a530c | 48 | "{\"message\":", |
| Jan Jongboom |
25:a8be9f3a530c | 49 | "\"this is an example", |
| Jan Jongboom |
25:a8be9f3a530c | 50 | " of chunked encoding\"}" |
| Jan Jongboom |
25:a8be9f3a530c | 51 | }; |
| Jan Jongboom |
25:a8be9f3a530c | 52 | |
| Jan Jongboom |
25:a8be9f3a530c | 53 | int chunk_ix = 0; |
| Jan Jongboom |
25:a8be9f3a530c | 54 | |
| Jan Jongboom |
25:a8be9f3a530c | 55 | // Callback function, grab the next chunk and return it |
| Jan Jongboom |
25:a8be9f3a530c | 56 | const void * get_chunk(size_t* out_size) { |
| Jan Jongboom |
25:a8be9f3a530c | 57 | // If you don't have any data left, set out_size to 0 and return a null pointer |
| Jan Jongboom |
25:a8be9f3a530c | 58 | if (chunk_ix == (sizeof(chunks) / sizeof(chunks[0]))) { |
| Jan Jongboom |
25:a8be9f3a530c | 59 | *out_size = 0; |
| Jan Jongboom |
25:a8be9f3a530c | 60 | return NULL; |
| Jan Jongboom |
25:a8be9f3a530c | 61 | } |
| Jan Jongboom |
25:a8be9f3a530c | 62 | const char *chunk = chunks[chunk_ix]; |
| Jan Jongboom |
25:a8be9f3a530c | 63 | *out_size = strlen(chunk); |
| Jan Jongboom |
25:a8be9f3a530c | 64 | chunk_ix++; |
| Jan Jongboom |
25:a8be9f3a530c | 65 | |
| Jan Jongboom |
25:a8be9f3a530c | 66 | return chunk; |
| Jan Jongboom |
25:a8be9f3a530c | 67 | } |
| Jan Jongboom |
25:a8be9f3a530c | 68 | |
| Jan Jongboom |
25:a8be9f3a530c | 69 | int main() { |
| Jan Jongboom |
25:a8be9f3a530c | 70 | NetworkInterface* network = easy_connect(true); |
| Jan Jongboom |
25:a8be9f3a530c | 71 | if (!network) { |
| Jan Jongboom |
25:a8be9f3a530c | 72 | return 1; |
| Jan Jongboom |
25:a8be9f3a530c | 73 | } |
| Jan Jongboom |
25:a8be9f3a530c | 74 | |
| Jan Jongboom |
25:a8be9f3a530c | 75 | // POST request to httpbin.org |
| Jan Jongboom |
25:a8be9f3a530c | 76 | { |
| Jan Jongboom |
25:a8be9f3a530c | 77 | HttpsRequest* post_req = new HttpsRequest(network, SSL_CA_PEM, HTTP_POST, "https://reqres.in/api/users"); |
| Jan Jongboom |
25:a8be9f3a530c | 78 | post_req->set_debug(true); |
| Jan Jongboom |
25:a8be9f3a530c | 79 | post_req->set_header("Content-Type", "application/json"); |
| Jan Jongboom |
25:a8be9f3a530c | 80 | |
| Jan Jongboom |
25:a8be9f3a530c | 81 | // If you pass a callback here, the Transfer-Encoding header is automatically set to chunked |
| Jan Jongboom |
25:a8be9f3a530c | 82 | HttpResponse* post_res = post_req->send(&get_chunk); |
| Jan Jongboom |
25:a8be9f3a530c | 83 | if (!post_res) { |
| Jan Jongboom |
25:a8be9f3a530c | 84 | printf("HttpsRequest failed (error code %d)\n", post_req->get_error()); |
| Jan Jongboom |
25:a8be9f3a530c | 85 | return 1; |
| Jan Jongboom |
25:a8be9f3a530c | 86 | } |
| Jan Jongboom |
25:a8be9f3a530c | 87 | |
| Jan Jongboom |
25:a8be9f3a530c | 88 | printf("\n----- HTTPS POST response -----\n"); |
| Jan Jongboom |
25:a8be9f3a530c | 89 | dump_response(post_res); |
| Jan Jongboom |
25:a8be9f3a530c | 90 | |
| Jan Jongboom |
25:a8be9f3a530c | 91 | delete post_req; |
| Jan Jongboom |
25:a8be9f3a530c | 92 | } |
| Jan Jongboom |
25:a8be9f3a530c | 93 | |
| Jan Jongboom |
25:a8be9f3a530c | 94 | wait(osWaitForever); |
| Jan Jongboom |
25:a8be9f3a530c | 95 | } |
| Jan Jongboom |
25:a8be9f3a530c | 96 | |
| Jan Jongboom |
25:a8be9f3a530c | 97 | #endif |
