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.
Revision 41:cc1a8c63f159, committed 2021-05-30
- Comitter:
- JohnnyK
- Date:
- Sun May 30 19:45:32 2021 +0000
- Parent:
- 40:6ecb52cd17d9
- Commit message:
- change test program to two basic example from SandBox's helloworld program ofc reworked.
Changed in this revision
--- a/TESTS/COMMON/test_setup.h Sat May 29 18:34:24 2021 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,101 +0,0 @@ -#ifndef _MBED_HTTP_TEST_SETUP_H_ -#define _MBED_HTTP_TEST_SETUP_H_ - -#include "mbed.h" -#include "NetworkInterface.h" - -/** - * Connect to the network using the default networking interface, - * you can also swap this out with a driver for a different networking interface - * if you use WiFi: see mbed_app.json for the credentials - */ -NetworkInterface *connect_to_default_network_interface() { - NetworkInterface* network = NetworkInterface::get_default_instance(); - - if (!network) { - return NULL; - } - - nsapi_error_t connect_status = network->connect(); - - if (connect_status != NSAPI_ERROR_OK) { - return NULL; - } - - return network; -} - - -/* List of trusted root CA certificates - * - * - Amazon, the CA for os.mbed.com - * - Let's Encrypt, the CA for httpbin.org - * - Comodo, the CA for reqres.in - * - * To add more root certificates, just concatenate them. - */ -const char SSL_CA_PEM[] = "-----BEGIN CERTIFICATE-----\n" - "MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF\n" - "ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6\n" - "b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL\n" - "MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv\n" - "b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj\n" - "ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM\n" - "9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw\n" - "IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6\n" - "VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L\n" - "93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm\n" - "jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\n" - "AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA\n" - "A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI\n" - "U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs\n" - "N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv\n" - "o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU\n" - "5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy\n" - "rqXRfboQnoZsG4q5WTP468SQvvG5\n" - "-----END CERTIFICATE-----\n" - "-----BEGIN CERTIFICATE-----\n" - "MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/\n" - "MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT\n" - "DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow\n" - "SjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT\n" - "GkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC\n" - "AQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF\n" - "q6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8\n" - "SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0\n" - "Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA\n" - "a6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj\n" - "/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0T\n" - "AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG\n" - "CCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv\n" - "bTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k\n" - "c3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw\n" - "VAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC\n" - "ARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz\n" - "MDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu\n" - "Y3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF\n" - "AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo\n" - "uM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/\n" - "wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu\n" - "X4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG\n" - "PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6\n" - "KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==\n" - "-----END CERTIFICATE-----\n" - "-----BEGIN CERTIFICATE-----\n" - "MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL\n" - "MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE\n" - "BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT\n" - "IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw\n" - "MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy\n" - "ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N\n" - "T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv\n" - "biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR\n" - "FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J\n" - "cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW\n" - "BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/\n" - "BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm\n" - "fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv\n" - "GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=\n" - "-----END CERTIFICATE-----\n"; - -#endif // MBED_HTTP_TEST_SETUP_H_
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TESTS/main-http.cpp Sun May 30 19:45:32 2021 +0000 @@ -0,0 +1,77 @@ +#if 0 /*Set it to "1" to enable content*/ + +#include "mbed.h" +#include "http_request.h" +#include "mbed_mem_trace.h" + +void dump_response(HttpResponse* res) { + printf("Status: %d - %s\n", res->get_status_code(), res->get_status_message().c_str()); + + printf("Headers:\n"); + for (size_t ix = 0; ix < res->get_headers_length(); ix++) { + printf("\t%s: %s\n", res->get_headers_fields()[ix]->c_str(), res->get_headers_values()[ix]->c_str()); + } + printf("\nBody (%d bytes):\n\n%s\n", res->get_body_length(), res->get_body_as_string().c_str()); +} + +int main() { + printf("Example of a HTTP client\n"); + // Connect to the network with the default networking interface + // if you use WiFi: see mbed_app.json for the credentials + printf("[NWK] Connecting to network...\n"); + NetworkInterface* network = NetworkInterface::get_default_instance(); + if (!network) { + printf("[NWK] No network interface found, select an interface in 'network-helper.h'\n"); + return 1; + } + nsapi_error_t err; + if ((err = network->connect())!= NSAPI_ERROR_OK) { + printf("[NWK] Failed to connect to network (%d)\n", err); + return 1; + } + printf("[NWK] Connected to the network\n"); + SocketAddress ip; + network->get_ip_address(&ip); + printf("[NWK] IP address: %s\n", ip.get_ip_address()); + + + // Do a GET request to httpbin.org + { + // By default the body is automatically parsed and stored in a buffer, this is memory heavy. + // To receive chunked response, pass in a callback as last parameter to the constructor. + HttpRequest* get_req = new HttpRequest(network, HTTP_GET, "http://httpbin.org/status/418"); + + HttpResponse* get_res = get_req->send(); + if (!get_res) { + printf("HttpRequest failed (error code %d)\n", get_req->get_error()); + return 1; + } + + printf("\n----- HTTP GET response -----\n"); + dump_response(get_res); + + delete get_req; + } + + // POST request to httpbin.org + { + HttpRequest* post_req = new HttpRequest(network, HTTP_POST, "http://httpbin.org/post"); + post_req->set_header("Content-Type", "application/json"); + + const char body[] = "{\"hello\":\"world\"}"; + + HttpResponse* post_res = post_req->send(body, strlen(body)); + if (!post_res) { + printf("HttpRequest failed (error code %d)\n", post_req->get_error()); + return 1; + } + + printf("\n----- HTTP POST response -----\n"); + dump_response(post_res); + + delete post_req; + } + + while(osWaitForever); +} +#endif \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TESTS/main-https.cpp Sun May 30 19:45:32 2021 +0000 @@ -0,0 +1,140 @@ +#if 0 /*Set it to "1" to enable content*/ + +#include "mbed.h" +#include "mbed_trace.h" +#include "https_request.h" + +/* List of trusted root CA certificates + * currently two: Amazon, the CA for os.mbed.com and Let's Encrypt, the CA for httpbin.org + * + * To add more root certificates, just concatenate them. + * + * !!! IF CA NOT WORKING SEE THIS PAGE - https://os.mbed.com/blog/entry/Adding-TLS-Sockets-to-Mbed-OS/ + * Under Windows you can run OpenSSl from C:\Program Files\Git\usr\bin\openssl.exe if you have Git installed. + * Then just executte "s_client -connect mbed.com:443 -showcerts" and "s_client -connect httpbin.org:443 -showcerts" + */ +const char SSL_CA_PEM[] = "-----BEGIN CERTIFICATE-----\n" + "MIIEdTCCA12gAwIBAgIJAKcOSkw0grd/MA0GCSqGSIb3DQEBCwUAMGgxCzAJBgNV\n" + "BAYTAlVTMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTIw\n" + "MAYDVQQLEylTdGFyZmllbGQgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0\n" + "eTAeFw0wOTA5MDIwMDAwMDBaFw0zNDA2MjgxNzM5MTZaMIGYMQswCQYDVQQGEwJV\n" + "UzEQMA4GA1UECBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTElMCMGA1UE\n" + "ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjE7MDkGA1UEAxMyU3RhcmZp\n" + "ZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIwggEi\n" + "MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVDDrEKvlO4vW+GZdfjohTsR8/\n" + "y8+fIBNtKTrID30892t2OGPZNmCom15cAICyL1l/9of5JUOG52kbUpqQ4XHj2C0N\n" + "Tm/2yEnZtvMaVq4rtnQU68/7JuMauh2WLmo7WJSJR1b/JaCTcFOD2oR0FMNnngRo\n" + "Ot+OQFodSk7PQ5E751bWAHDLUu57fa4657wx+UX2wmDPE1kCK4DMNEffud6QZW0C\n" + "zyyRpqbn3oUYSXxmTqM6bam17jQuug0DuDPfR+uxa40l2ZvOgdFFRjKWcIfeAg5J\n" + "Q4W2bHO7ZOphQazJ1FTfhy/HIrImzJ9ZVGif/L4qL8RVHHVAYBeFAlU5i38FAgMB\n" + "AAGjgfAwge0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0O\n" + "BBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMB8GA1UdIwQYMBaAFL9ft9HO3R+G9FtV\n" + "rNzXEMIOqYjnME8GCCsGAQUFBwEBBEMwQTAcBggrBgEFBQcwAYYQaHR0cDovL28u\n" + "c3MyLnVzLzAhBggrBgEFBQcwAoYVaHR0cDovL3guc3MyLnVzL3guY2VyMCYGA1Ud\n" + "HwQfMB0wG6AZoBeGFWh0dHA6Ly9zLnNzMi51cy9yLmNybDARBgNVHSAECjAIMAYG\n" + "BFUdIAAwDQYJKoZIhvcNAQELBQADggEBACMd44pXyn3pF3lM8R5V/cxTbj5HD9/G\n" + "VfKyBDbtgB9TxF00KGu+x1X8Z+rLP3+QsjPNG1gQggL4+C/1E2DUBc7xgQjB3ad1\n" + "l08YuW3e95ORCLp+QCztweq7dp4zBncdDQh/U90bZKuCJ/Fp1U1ervShw3WnWEQt\n" + "8jxwmKy6abaVd38PMV4s/KCHOkdp8Hlf9BRUpJVeEXgSYCfOn8J3/yNTd126/+pZ\n" + "59vPr5KW7ySaNRB6nJHGDn2Z9j8Z3/VyVOEVqQdZe4O/Ui5GjLIAZHYcSNPYeehu\n" + "VsyuLAOQ1xk4meTKCRlb/weWsKh/NEnfVqn3sF/tM+2MR7cwA130A4w=\n" + "-----END CERTIFICATE-----\n" + "-----BEGIN CERTIFICATE-----\n" + "MIIEdTCCA12gAwIBAgIJAKcOSkw0grd/MA0GCSqGSIb3DQEBCwUAMGgxCzAJBgNV\n" + "BAYTAlVTMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTIw\n" + "MAYDVQQLEylTdGFyZmllbGQgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0\n" + "eTAeFw0wOTA5MDIwMDAwMDBaFw0zNDA2MjgxNzM5MTZaMIGYMQswCQYDVQQGEwJV\n" + "UzEQMA4GA1UECBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTElMCMGA1UE\n" + "ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjE7MDkGA1UEAxMyU3RhcmZp\n" + "ZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIwggEi\n" + "MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVDDrEKvlO4vW+GZdfjohTsR8/\n" + "y8+fIBNtKTrID30892t2OGPZNmCom15cAICyL1l/9of5JUOG52kbUpqQ4XHj2C0N\n" + "Tm/2yEnZtvMaVq4rtnQU68/7JuMauh2WLmo7WJSJR1b/JaCTcFOD2oR0FMNnngRo\n" + "Ot+OQFodSk7PQ5E751bWAHDLUu57fa4657wx+UX2wmDPE1kCK4DMNEffud6QZW0C\n" + "zyyRpqbn3oUYSXxmTqM6bam17jQuug0DuDPfR+uxa40l2ZvOgdFFRjKWcIfeAg5J\n" + "Q4W2bHO7ZOphQazJ1FTfhy/HIrImzJ9ZVGif/L4qL8RVHHVAYBeFAlU5i38FAgMB\n" + "AAGjgfAwge0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0O\n" + "BBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMB8GA1UdIwQYMBaAFL9ft9HO3R+G9FtV\n" + "rNzXEMIOqYjnME8GCCsGAQUFBwEBBEMwQTAcBggrBgEFBQcwAYYQaHR0cDovL28u\n" + "c3MyLnVzLzAhBggrBgEFBQcwAoYVaHR0cDovL3guc3MyLnVzL3guY2VyMCYGA1Ud\n" + "HwQfMB0wG6AZoBeGFWh0dHA6Ly9zLnNzMi51cy9yLmNybDARBgNVHSAECjAIMAYG\n" + "BFUdIAAwDQYJKoZIhvcNAQELBQADggEBACMd44pXyn3pF3lM8R5V/cxTbj5HD9/G\n" + "VfKyBDbtgB9TxF00KGu+x1X8Z+rLP3+QsjPNG1gQggL4+C/1E2DUBc7xgQjB3ad1\n" + "l08YuW3e95ORCLp+QCztweq7dp4zBncdDQh/U90bZKuCJ/Fp1U1ervShw3WnWEQt\n" + "8jxwmKy6abaVd38PMV4s/KCHOkdp8Hlf9BRUpJVeEXgSYCfOn8J3/yNTd126/+pZ\n" + "59vPr5KW7ySaNRB6nJHGDn2Z9j8Z3/VyVOEVqQdZe4O/Ui5GjLIAZHYcSNPYeehu\n" + "VsyuLAOQ1xk4meTKCRlb/weWsKh/NEnfVqn3sF/tM+2MR7cwA130A4w=\n" + "-----END CERTIFICATE-----\n"; + +void dump_response(HttpResponse* res) { + printf("Status: %d - %s\n", res->get_status_code(), res->get_status_message().c_str()); + + printf("Headers:\n"); + for (size_t ix = 0; ix < res->get_headers_length(); ix++) { + printf("\t%s: %s\n", res->get_headers_fields()[ix]->c_str(), res->get_headers_values()[ix]->c_str()); + } + printf("\nBody (%lu bytes):\n\n%s\n", res->get_body_length(), res->get_body_as_string().c_str()); +} + +int main() { + printf("Example of a HTTPS client\n"); + printf("[NWK] Connecting to network...\n"); + NetworkInterface* network = NetworkInterface::get_default_instance(); + if (!network) { + printf("[NWK] No network interface found, select an interface in 'network-helper.h'\n"); + return 1; + } + nsapi_error_t err; + if ((err = network->connect())!= NSAPI_ERROR_OK) { + printf("[NWK] Failed to connect to network (%d)\n", err); + return 1; + } + printf("[NWK] Connected to the network\n"); + SocketAddress ip; + network->get_ip_address(&ip); + printf("[NWK] IP address: %s\n", ip.get_ip_address()); + + mbed_trace_init(); + + // GET request to os.mbed.com + { + printf("\n----- HTTPS GET request -----\n"); + + HttpsRequest* get_req = new HttpsRequest(network, SSL_CA_PEM, HTTP_GET, "https://os.mbed.com/media/uploads/mbed_official/hello.txt"); + + HttpResponse* get_res = get_req->send(); + if (!get_res) { + printf("HttpRequest failed (error code %d)\n", get_req->get_error()); + return 1; + } + printf("\n----- HTTPS GET response -----\n"); + dump_response(get_res); + + delete get_req; + } + + // POST request to httpbin.org + { + printf("\n----- HTTPS POST request -----\n"); + + HttpsRequest* post_req = new HttpsRequest(network, SSL_CA_PEM, HTTP_POST, "https://httpbin.org/post"); + post_req->set_header("Content-Type", "application/json"); + + const char body[] = "{\"hello\":\"world\"}"; + + HttpResponse* post_res = post_req->send(body, strlen(body)); + if (!post_res) { + printf("HttpRequest failed (error code %d)\n", post_req->get_error()); + return 1; + } + + printf("\n----- HTTPS POST response -----\n"); + dump_response(post_res); + + delete post_req; + } + + while(osWaitForever); +} + +#endif
--- a/TESTS/tests/integration/main.cpp Sat May 29 18:34:24 2021 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,266 +0,0 @@ -/* - * PackageLicenseDeclared: Apache-2.0 - * Copyright (c) 2018 ARM Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "mbed.h" -#include "http_request.h" -#include "https_request.h" -#include "test_setup.h" -#include "utest/utest.h" -#include "unity/unity.h" -#include "greentea-client/test_env.h" - -using namespace utest::v1; - -static NetworkInterface *network; - -static void setup_verify_network() { - if (!network) network = connect_to_default_network_interface(); - TEST_ASSERT_NOT_NULL(network); -} - -// verifies that the header is present and has a certain value -static void assert_header(HttpResponse *res, const char *header, const char *value) { - bool headerPresent = false; - for (size_t ix = 0; ix < res->get_headers_length(); ix++) { - if (res->get_headers_fields()[ix]->compare(header)) { - headerPresent = true; - - TEST_ASSERT(res->get_headers_values()[ix]->compare(value)); - } - } - TEST_ASSERT_EQUAL(true, headerPresent); -} - -static control_t http_get(const size_t call_count) { - setup_verify_network(); - - HttpRequest *req = new HttpRequest(network, HTTP_GET, "http://httpbin.org/status/418"); - - HttpResponse* res = req->send(); - TEST_ASSERT(res); - TEST_ASSERT_EQUAL(418, res->get_status_code()); - - delete req; - - return CaseNext; -} - -static control_t http_post(const size_t call_count) { - setup_verify_network(); - - HttpRequest* req = new HttpRequest(network, HTTP_POST, "http://httpbin.org/post"); - req->set_header("Content-Type", "application/json"); - - const char body[] = "{\"mykey\":\"mbedvalue\"}"; - - HttpResponse* res = req->send(body, strlen(body)); - TEST_ASSERT(res); - TEST_ASSERT_EQUAL(200, res->get_status_code()); - - // verify that the Content-Type header is present, and set to application/json - assert_header(res, "Content-Type", "application/json"); - - // verify that both the key and value are present in the response - TEST_ASSERT(res->get_body_length() > 0); - TEST_ASSERT_NOT_EQUAL(res->get_body_as_string().find("mykey"), string::npos); - TEST_ASSERT_NOT_EQUAL(res->get_body_as_string().find("mbedvalue"), string::npos); - - delete req; - - return CaseNext; -} - -static control_t http_socket_reuse(const size_t call_count) { - setup_verify_network(); - - TCPSocket socket; - nsapi_error_t open_result = socket.open(network); - TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, open_result); - - nsapi_error_t connect_result = socket.connect("httpbin.org", 80); - TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, connect_result); - - { - HttpRequest *req = new HttpRequest(&socket, HTTP_GET, "http://httpbin.org/status/404"); - - HttpResponse* res = req->send(); - TEST_ASSERT(res); - TEST_ASSERT_EQUAL(404, res->get_status_code()); - - delete req; - } - - { - HttpRequest *req = new HttpRequest(&socket, HTTP_GET, "http://httpbin.org/status/403"); - - HttpResponse* res = req->send(); - TEST_ASSERT(res); - TEST_ASSERT_EQUAL(403, res->get_status_code()); - - delete req; - } - - return CaseNext; -} - -static control_t https_get(const size_t call_count) { - setup_verify_network(); - - HttpsRequest *req = new HttpsRequest(network, SSL_CA_PEM, HTTP_GET, "https://os.mbed.com/media/uploads/mbed_official/hello.txt"); - - HttpResponse* res = req->send(); - TEST_ASSERT(res); - TEST_ASSERT_EQUAL(200, res->get_status_code()); - TEST_ASSERT(res->get_body_length() > 0); - TEST_ASSERT_NOT_EQUAL(res->get_body_as_string().find("Hello world!"), string::npos); - - delete req; - - return CaseNext; -} - -static control_t https_post(const size_t call_count) { - setup_verify_network(); - - HttpsRequest* req = new HttpsRequest(network, SSL_CA_PEM, HTTP_POST, "https://httpbin.org/post"); - req->set_header("Content-Type", "application/json"); - - const char body[] = "{\"myhttpskey\":\"janjanjan\"}"; - - HttpResponse* res = req->send(body, strlen(body)); - TEST_ASSERT(res); - TEST_ASSERT_EQUAL(200, res->get_status_code()); - - // verify that the Content-Type header is present, and set to application/json - assert_header(res, "Content-Type", "application/json"); - - // verify that both the key and value are present in the response - TEST_ASSERT(res->get_body_length() > 0); - TEST_ASSERT_NOT_EQUAL(res->get_body_as_string().find("myhttpskey"), string::npos); - TEST_ASSERT_NOT_EQUAL(res->get_body_as_string().find("janjanjan"), string::npos); - - delete req; - - return CaseNext; -} - -static control_t https_socket_reuse(const size_t call_count) { - setup_verify_network(); - - TLSSocket socket; - nsapi_error_t open_result = socket.open(network); - TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, open_result); - - nsapi_error_t ca_result = socket.set_root_ca_cert(SSL_CA_PEM); - TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, ca_result); - - nsapi_error_t connect_result = socket.connect("httpbin.org", 443); - TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, connect_result); - - { - HttpsRequest *req = new HttpsRequest(&socket, HTTP_GET, "http://httpbin.org/status/404"); - - HttpResponse* res = req->send(); - TEST_ASSERT(res); - TEST_ASSERT_EQUAL(404, res->get_status_code()); - - delete req; - } - - { - HttpsRequest *req = new HttpsRequest(&socket, HTTP_GET, "http://httpbin.org/status/403"); - - HttpResponse* res = req->send(); - TEST_ASSERT(res); - TEST_ASSERT_EQUAL(403, res->get_status_code()); - - delete req; - } - - return CaseNext; -} - -// Spread the message out over 3 different chunks -const char * chunks[] = { - "{\"message\":", - "\"this is an example", - " of chunked encoding\"}" -}; - -int chunk_ix = 0; - -// Callback function, grab the next chunk and return it -const void * get_chunk(uint32_t* out_size) { - // If you don't have any data left, set out_size to 0 and return a null pointer - if (chunk_ix == (sizeof(chunks) / sizeof(chunks[0]))) { - *out_size = 0; - return NULL; - } - const char *chunk = chunks[chunk_ix]; - *out_size = strlen(chunk); - chunk_ix++; - - return chunk; -} - -static control_t chunked_request(const size_t call_count) { - setup_verify_network(); - - HttpsRequest *req = new HttpsRequest(network, SSL_CA_PEM, HTTP_POST, "https://reqres.in/api/users"); - req->set_header("Content-Type", "application/json"); - - HttpResponse* res = req->send(&get_chunk); - TEST_ASSERT(res); - TEST_ASSERT_EQUAL(201, res->get_status_code()); - TEST_ASSERT(res->get_body_length() > 0); - TEST_ASSERT_NOT_EQUAL(res->get_body_as_string().find("message"), string::npos); - TEST_ASSERT_NOT_EQUAL(res->get_body_as_string().find("this is an example of chunked encoding"), string::npos); - TEST_ASSERT_NOT_EQUAL(res->get_body_as_string().find("createdAt"), string::npos); - - delete req; - - return CaseNext; -} - -utest::v1::status_t greentea_setup(const size_t number_of_cases) { - GREENTEA_SETUP(1*60, "default_auto"); - return greentea_test_setup_handler(number_of_cases); -} - -Case cases[] = { - Case("http get", http_get), - Case("http post", http_post), - Case("http socket reuse", http_socket_reuse), - Case("https get", https_get), - Case("https post", https_post), - Case("https socket reuse", https_socket_reuse), - Case("chunked request", chunked_request) -}; - -Specification specification(greentea_setup, cases); - -void blink_led() { - static DigitalOut led(LED1); - led = !led; -} - -int main() { - Ticker t; - t.attach(blink_led, 0.5); - - return !Harness::run(specification); -}