-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathZTcURL.c
More file actions
201 lines (117 loc) · 6.1 KB
/
Copy pathZTcURL.c
File metadata and controls
201 lines (117 loc) · 6.1 KB
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
//Code form the following example has been used: https://curl.se/libcurl/c/externalsocket.html
#include <ziti/zitilib.h>
#include <curl/curl.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
static curl_socket_t opensocket(void *clientp, curlsocktype purpose, struct curl_sockaddr *address){
curl_socket_t sockfd;
sockfd = *(curl_socket_t *)clientp; /* The socket created by the OpenZiti SDK and
connected to an OpenZiti Network Router is
passed to this function via the OPENSOCKETDATA
option and is mapped to the 'clientp' variable of
this function */
return sockfd;
}
static int sockopt_callback(void *clientp, curl_socket_t curlfd, curlsocktype purpose){
(void)clientp;
(void)curlfd;
(void)purpose;
/* This return code was added in libcurl 7.21.5 */
return CURL_SOCKOPT_ALREADY_CONNECTED;
}
int main(int argc, char *argv[]){
CURLU *h;
CURLUcode uc;
h = curl_url();
uc = curl_url_set(h, CURLUPART_URL, argv[1], 0);
char *full_url = NULL;
char *host, *port, *path, *query;
if(!uc) {
curl_url_get(h, CURLUPART_HOST, &host, 0);
curl_url_get(h, CURLUPART_PORT, &port, 0);
curl_url_get(h, CURLUPART_PATH, &path, 0);
curl_url_get(h, CURLUPART_QUERY, &query, 0);
CURLU *urlp;
urlp = curl_url();
if (!urlp) {
fprintf(stderr, "Failed to create CURLU handle\n");
return 1;
}
CURLUcode rc;
rc = curl_url_set(urlp, CURLUPART_URL, "http://99.99.99.99:9999", 0);
if (rc) {
fprintf(stderr, "Failed to set base URL: %s\n", curl_url_strerror(rc));
curl_url_cleanup(urlp);
return 1;
}
rc = curl_url_set(urlp, CURLUPART_PATH, path, CURLU_URLENCODE);
if (rc) {
fprintf(stderr, "Failed to set path: %s\n", curl_url_strerror(rc));
curl_url_cleanup(urlp);
return 1;
}
rc = curl_url_set(urlp, CURLUPART_QUERY, query, CURLU_URLENCODE);
if (rc) {
fprintf(stderr, "Failed to set query: %s\n", curl_url_strerror(rc));
curl_url_cleanup(urlp);
return 1;
}
rc = curl_url_get(urlp, CURLUPART_URL, &full_url, 0);
if (rc) {
fprintf(stderr, "Failed to get full URL: %s\n", curl_url_strerror(rc));
curl_url_cleanup(urlp);
return 1;
}
/* Clean up */
curl_url_cleanup(urlp);
curl_free(path);
curl_free(query);
} else {
fprintf(stderr, "Error parsing URL: %s\n", curl_easy_strerror(uc));
}
curl_url_cleanup(h);
CURL *curl;
CURLcode res;
#ifdef _WIN32
WSADATA wsaData;
int initwsa = WSAStartup(MAKEWORD(2, 2), &wsaData);
if(initwsa) {
printf("WSAStartup failed: %d\n", initwsa);
return 1;
}
#endif
curl = curl_easy_init();
if(curl) {
/*
* Note that libcurl internally thinks that you connect to the host and
* port that you specify in the URL option.
*/
curl_easy_setopt(curl, CURLOPT_URL, full_url);
/* call this function to get a socket */
curl_easy_setopt(curl, CURLOPT_OPENSOCKETFUNCTION, opensocket);
Ziti_lib_init();
const char *identity_file = argv[2];
ziti_context ztx = Ziti_load_context(identity_file);
ziti_socket_t sock = Ziti_socket(SOCK_STREAM);
Ziti_connect_addr(sock, host, (unsigned int)strtoul(port, NULL, 10));
curl_easy_setopt(curl, CURLOPT_OPENSOCKETDATA, &sock);
/* call this function to set options for the socket */
curl_easy_setopt(curl, CURLOPT_SOCKOPTFUNCTION, sockopt_callback);
res = curl_easy_perform(curl);
printf("\n");
Ziti_lib_shutdown();
curl_easy_cleanup(curl);
if(res) {
printf("libcurl error: %d\n", res);
return 4;
}
curl_free(host);
curl_free(port);
curl_free(full_url);
}
#ifdef _WIN32
WSACleanup();
#endif
return 0;
}