http_client

TEST_FIXTURE(uri_address, create_https_listener_get, "Ignore", "github 209")
{
    const char * self_signed_cert = R"(
-----BEGIN CERTIFICATE-----
MIIDlzCCAn+gAwIBAgIJAP9ZV+1X94UjMA0GCSqGSIb3DQEBBQUAMGIxCzAJBgNV
BAYTAkNOMQswCQYDVQQIDAJTSDELMAkGA1UEBwwCU0gxEjAQBgNVBAoMCU1JQ1JP
U09GVDERMA8GA1UECwwISFBDLVBBQ0sxEjAQBgNVBAMMCWxvY2FsaG9zdDAeFw0x
NTA4MTkwOTA0MjhaFw00MzAxMDMwOTA0MjhaMGIxCzAJBgNVBAYTAkNOMQswCQYD
VQQIDAJTSDELMAkGA1UEBwwCU0gxEjAQBgNVBAoMCU1JQ1JPU09GVDERMA8GA1UE
CwwISFBDLVBBQ0sxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEB
BQADggEPADCCAQoCggEBALLv7AAPa+4wYpa+3tqc9HIHhh8kv/MpV2Dm+oKG27iH
zOugMNAPqLzMAaWCzDRyw27I+jPS3pzAAu6rQ0v2H6XNrie1YEEV27j1WOUS9iFy
vcf6Y+ywUKXvFlN/VM/ZFz9Z8U3jc7Y6unIyoUs8UdX/RRITspb2m7SUxlmLJ+4c
qiLrHwstNB2NHIZN72oc8DaS5eBqBdT9h6NO62RSBTrAlR7Vk9eU/5trYkd5+PoC
pispvU+7Fe24uVerGgU6Yoyd7DMj+3BpbG3g/VkOlGhgH0DNtbKu3v/XOmnzdZn6
dzoOoGFNpG1NeH2Xv0vnvEZP6WG4h/TFSafBJMONNnMCAwEAAaNQME4wHQYDVR0O
BBYEFO1mAjAmLk1J0iT93xfczAE5mxgzMB8GA1UdIwQYMBaAFO1mAjAmLk1J0iT9
3xfczAE5mxgzMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAFB8AACf
5O+sPe3PZ8IPgwZb+BCXdoXc2rngR/gOaYO019TZyNLuHRzW9FtplzW25IbQ9Jnc
b+jmY2Ill7Zf3TX4OhHEwscJ1G2LBaqZfQlwSbYJmCzvRNSzSbF3RigNQD5Qhdph
vVBdvVGTZnVeatjTOFKUyfhcXf4DMb6eMfaU6il/VJCSMW0j3hYNQjPm3V/PLxnG
fd9T4hpCUd8MK2XG4RqJAzh6x/6v0fc6mRHBS5+qTWYSDGFwITrU1pP2L9qFegpm
aNAom7bdENU8uivd+vrLnG2fKvFSssjVfaXpFLKAICfTJY9A3/CWnZ1AcbE5El7A
adctopihoUrlAb0=
-----END CERTIFICATE-----
        )";
    const char * private_key = R"(
-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCy7+wAD2vuMGKW
vt7anPRyB4YfJL/zKVdg5vqChtu4h8zroDDQD6i8zAGlgsw0csNuyPoz0t6cwALu
q0NL9h+lza4ntWBBFdu49VjlEvYhcr3H+mPssFCl7xZTf1TP2Rc/WfFN43O2Orpy
MqFLPFHV/0USE7KW9pu0lMZZiyfuHKoi6x8LLTQdjRyGTe9qHPA2kuXgagXU/Yej
TutkUgU6wJUe1ZPXlP+ba2JHefj6AqYrKb1PuxXtuLlXqxoFOmKMnewzI/twaWxt
4P1ZDpRoYB9AzbWyrt7/1zpp83WZ+nc6DqBhTaRtTXh9l79L57xGT+lhuIf0xUmn
wSTDjTZzAgMBAAECggEAenzd8lScL1qTwlk6ODAE7SHVX/BKLWv5Um4KwdsLAVCE
qC7p+yMdANAtuFzG6Ig+29Fb5KnOlUKjPzmhQZhjpZ4cPzZbg3IxDHV2uqi2L8NZ
wlDWoik3q770a4fYSMd0sHsjQYwXo4CkLJQX8WaDJpgtcehl8g0yHPVSqe0mEkoL
dxdqaZnxprchscxefWaGaysIxEO+V+ZOBaPNf4i8PmBKoMNczWZbLcdKhRL7aLeW
ngPQp1xSWYoN8fPoonpL2qTSop3Nsc2INpwGcYPAj3vxdasC3+DZ8JEJI2AmxpVB
13BLkd3nDzOwimZIlu9Fv+NMJ1vb9XdC249ZOqo68QKBgQDigkws1W429nqDtEtQ
Dr5ebHTdP4gZlNt6vWx5obGLCMBAzoyubfNCCBTCYsCPj8hXxNfiPArPFFkIgEx9
+w0n7BlaYL6SD2xD4q+YzA1/j4Loakxc7N9z8Cyu+/YHifvLhzwqgFnkLfFnVq9N
TF8TatHUYcrbcpawJLz0wr/cnQKBgQDKPAYNTzqPLOOBaE4DfnJNn2zctGU8G5Xp
0L/ED8O1t9AjjV2xVO8PDPNDZAxMzgnIbWeU9iWRSLbr7NloXElKh/QlITjAbSXe
HsUruq1SmDgiaUhEtDaaJ1SqSZZWY2BZqNXMdILOCgvZGnOyyBR2U49zuNaRHyhm
kmZMdIIKTwKBgQDezAk/hEQfvfuuNpZpzcbEu+uLgKVPfFMSfOYJEdnAB0CLvl80
Z6QBzE8XEOmVjHkkk9NBjYuYOsyEhyY2OM2s+hfKBSUOKCt27q+IHRYd5bx+/afV
M41rzc8141ISAlBw1rmAmLVSszojSmmuH7PZNpXkULineCPuaISQQEtWJQKBgQDD
laVsvdEuowUsJEo+ys2VELhiAv1dUnh79u1fmrd2SV085P1WAYRqE+Y4qMvUg/em
JVjmEeBnT+HI7fmdGpOvRyjxt92BDI5w8WVTU2lI1fqEHTpNZ9Te5WbWgfCpf9ax
H74VzCCtT74Bq7l1kFdp0IqOKpcpJu8VtETHcG5LtQKBgQC4Tx7El1Xb4hsI4dvE
h43j3KBb3evlz6vaqgz0BArahYAz2UkkOYDSOPs4K6aOxxXjO0BjqQqCx/tCPcU5
AvLsTlswO+wDLXM1DoKxzFBZL5o8927niqW+vZpzyGc1uPmC1MG7+MDKdZsR+e+9
XzJTD4slrGSJrcpLt/g/Jqqdjg==
-----END PRIVATE KEY-----
        )";

 

    auto body = utility::string_t{U("body content")};
    http_headers all_headers;
    all_headers.add(U("Accept"), U("text/plain"));
    all_headers.add(U("Accept-Charset"), U("utf-8"));
    all_headers.add(U("Accept-Encoding"), U("gzip, deflate"));
    all_headers.add(U("Accept-Language"), U("en-US"));
    all_headers.add(U("Accept-Datetime"), U("Thu, 31 May 2007 20:35:00 GMT"));
    all_headers.add(U("Authorization"), U("Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=="));
    all_headers.add(U("Cache-Control"), U("no-cache"));
    all_headers.add(U("Cookie"), U("$Version=1; Skin=new;"));
    all_headers.add(U("Content-Length"), body.size());
    all_headers.add(U("Content-MD5"), U("Q2hlY2sgSW50ZWdyaXR5IQ=="));
    all_headers.add(U("Content-Type"), U("application/x-www-form-urlencoded"));
    all_headers.add(U("Date"), U("Tue, 15 Nov 1994 08:12:31 GMT"));
    all_headers.add(U("Expect"), U("100-continue"));
    all_headers.add(U("Forwarded"), U("for=192.0.2.60;proto=http;by=203.0.113.43Forwarded: for=192.0.2.43, for=198.51.100.17"));
    all_headers.add(U("From"), U("user@example.com"));
    all_headers.add(U("Host"), U("en.wikipedia.org"));
    all_headers.add(U("If-Match"), U("\"737060cd8c284d8af7ad3082f209582d\""));
    all_headers.add(U("If-Modified-Since"), U("Sat, 29 Oct 1994 19:43:31 GMT"));
    all_headers.add(U("If-None-Match"), U("\"737060cd8c284d8af7ad3082f209582d\""));
    all_headers.add(U("If-Range"), U("\"737060cd8c284d8af7ad3082f209582d\""));
    all_headers.add(U("If-Unmodified-Since"), U("Sat, 29 Oct 1994 19:43:31 GMT"));
    all_headers.add(U("Max-Forwards"), U("10"));
    all_headers.add(U("Origin"), U("http://www.example-social-network.com"));
    all_headers.add(U("Pragma"), U("no-cache"));
    all_headers.add(U("Proxy-Authorization"), U("Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=="));
    all_headers.add(U("Range"), U("bytes=500-999"));
    all_headers.add(U("Referer"), U("http://en.wikipedia.org/wiki/Main_Page"));
    all_headers.add(U("TE"), U("trailers, deflate"));
    all_headers.add(U("User-Agent"), U("Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/21.0"));
    all_headers.add(U("Upgrade"), U("HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11"));
    all_headers.add(U("Via"), U("1.0 fred, 1.1 example.com (Apache/1.1)"));
    all_headers.add(U("Warning"), U("199 Miscellaneous warning"));

 

    boost::asio::const_buffer cert(self_signed_cert, std::strlen(self_signed_cert));
    boost::asio::const_buffer key(private_key, std::strlen(private_key));

 

    http_listener_config server_config;
    server_config.set_ssl_context_callback(
        [&](boost::asio::ssl::context& ctx)
        {
            ctx.set_options(boost::asio::ssl::context::default_workarounds);
            ctx.use_certificate_chain(cert);
            ctx.use_private_key(key, boost::asio::ssl::context::pem);
        });

 

    http_listener listener(m_secure_uri, server_config);

 

    listener.support(methods::GET,
        [&](http_request request)
        {
            http_asserts::assert_request_equals(request, methods::GET, U("/"));

 

            for (auto&& h : all_headers)
            {
                VERIFY_IS_TRUE(request.headers().has(h.first));
                VERIFY_ARE_EQUAL(h.second, request.headers().find(h.first)->second);
            }

 

            VERIFY_ARE_EQUAL(body, request.extract_string(true).get());

 

            request.reply(status_codes::OK);
        });

 

    listener.open().wait();

 

    client::http_client_config client_config;
    client_config.set_ssl_context_callback(
        [&](boost::asio::ssl::context& ctx)
        {
            ctx.add_certificate_authority(cert);
        });

 

    client::http_client client(m_secure_uri, client_config);
    http_request msg(methods::GET);
    msg.set_request_uri(U("/"));

 

    msg.headers() = all_headers;
    msg.set_body(body);

 

    http_asserts::assert_response_equals(client.request(msg).get(), status_codes::OK);

 

    listener.close().wait();
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`esp_http_client`结构体是ESP-IDF中用于表示一个HTTP客户端的结构体,定义在`esp_http_client.h`头文件中。它包含了HTTP客户端的各种属性和方法,用于管理HTTP请求和响应的过程。 下面是`esp_http_client`结构体的定义: ``` typedef struct esp_http_client { esp_http_client_config_t *config; /*!< HTTP client configuration */ esp_http_client_event_cb_t event_cb; /*!< Callback function to handle HTTP events */ esp_transport_handle_t transport; /*!< Transport handle */ esp_http_client_state_t state; /*!< HTTP client state */ esp_http_client_data_t data; /*!< HTTP client data */ esp_http_client_response_t response;/*!< HTTP client response */ esp_http_client_hooks_t hooks; /*!< HTTP client hooks */ } esp_http_client_t; ``` 其中,各个成员的含义如下: - `config`:HTTP客户端的配置选项,包括URL、请求方法、请求头、请求体等; - `event_cb`:HTTP客户端的事件回调函数,用于处理HTTP请求过程中的各种事件,例如连接成功、数据接收等; - `transport`:HTTP客户端的传输层句柄,用于发送和接收HTTP请求和响应数据; - `state`:HTTP客户端的当前状态,包括未连接、已连接、正在发送数据、正在接收数据等; - `data`:HTTP客户端的请求数据,包括请求体、请求体长度等; - `response`:HTTP客户端的响应数据,包括响应头、响应体、响应状态码等; - `hooks`:HTTP客户端的钩子函数,用于处理HTTP客户端的各种事件。 在使用ESP-IDF进行HTTP请求时,我们需要先创建一个`esp_http_client_t`类型的HTTP客户端结构体,然后设置其配置选项、事件回调函数等,并最终通过`esp_http_client_perform()`函数来发送HTTP请求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值