1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
//
// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#include "convey.h"
#include "trantest.h"
#ifndef _WIN32
#include <arpa/inet.h>
#endif
// Basic HTTP client tests.
#include "core/nng_impl.h"
#include "supplemental/http/http.h"
#include "supplemental/sha1/sha1.h"
#include "supplemental/tls/tls.h"
const uint8_t example_sum[20] = { 0x0e, 0x97, 0x3b, 0x59, 0xf4, 0x76, 0x00,
0x7f, 0xd1, 0x0f, 0x87, 0xf3, 0x47, 0xc3, 0x95, 0x60, 0x65, 0x51, 0x6f,
0xc0 };
TestMain("HTTP Client", {
nni_init();
atexit(nng_fini);
Convey("Given a TCP connection to httpbin.org", {
nng_aio * aio;
nng_http_client *cli;
nng_http_conn * http;
nng_url * url;
So(nng_aio_alloc(&aio, NULL, NULL) == 0);
So(nng_url_parse(&url, "http://example.org/") == 0);
So(nng_http_client_alloc(&cli, url) == 0);
nng_http_client_connect(cli, aio);
nng_aio_wait(aio);
So(nng_aio_result(aio) == 0);
http = nng_aio_get_output(aio, 0);
Reset({
nng_http_client_free(cli);
nng_http_conn_close(http);
nng_aio_free(aio);
nng_url_free(url);
});
Convey("We can initiate a message", {
nng_http_req *req;
nng_http_res *res;
So(http != NULL);
So(nng_http_req_alloc(&req, url) == 0);
So(nng_http_res_alloc(&res) == 0);
Reset({
nng_http_req_free(req);
nng_http_res_free(res);
});
nng_http_conn_write_req(http, req, aio);
nng_aio_wait(aio);
So(nng_aio_result(aio) == 0);
nng_http_conn_read_res(http, res, aio);
nng_aio_wait(aio);
So(nng_aio_result(aio) == 0);
So(nng_http_res_get_status(res) == 200);
Convey("The message contents are correct", {
uint8_t digest[20];
void * data;
const char *cstr;
size_t sz;
nng_iov iov;
cstr = nng_http_res_get_header(
res, "Content-Length");
So(cstr != NULL);
sz = atoi(cstr);
So(sz > 0);
data = nni_alloc(sz);
So(data != NULL);
Reset({ nni_free(data, sz); });
iov.iov_buf = data;
iov.iov_len = sz;
So(nng_aio_set_iov(aio, 1, &iov) == 0);
nng_aio_wait(aio);
So(nng_aio_result(aio) == 0);
nng_http_conn_read_all(http, aio);
nng_aio_wait(aio);
So(nng_aio_result(aio) == 0);
nni_sha1(data, sz, digest);
So(memcmp(digest, example_sum, 20) == 0);
});
});
});
})
|