24
32
/*Proxy-authorization: basic aGVsbG86d29ybGQ= */
26
34
lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_PEER_ADDRESS),
35
wsi->u.hdr.ah->c_port);
36
ads = context->http_proxy_address;
39
if (LWS_IPV6_ENABLED(context))
40
server_addr6.sin6_port = htons(context->http_proxy_port);
43
server_addr4.sin_port = htons(context->http_proxy_port);
46
ads = lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_PEER_ADDRESS);
48
if (LWS_IPV6_ENABLED(context))
49
server_addr6.sin6_port = htons(wsi->u.hdr.ah->c_port);
52
server_addr4.sin_port = htons(wsi->u.hdr.ah->c_port);
56
* prepare the actual connection (to the proxy, if any)
58
lwsl_client("libwebsocket_client_connect_2: address %s\n", ads);
61
if (LWS_IPV6_ENABLED(context)) {
62
memset(&hints, 0, sizeof(struct addrinfo));
63
n = getaddrinfo(ads, NULL, &hints, &result);
66
lwsl_err("getaddrinfo: %ls\n", gai_strerrorW(n));
68
lwsl_err("getaddrinfo: %s\n", gai_strerror(n));
73
server_addr6.sin6_family = AF_INET6;
74
switch (result->ai_family) {
76
/* map IPv4 to IPv6 */
77
bzero((char *)&server_addr6.sin6_addr,
78
sizeof(struct in6_addr));
79
server_addr6.sin6_addr.s6_addr[10] = 0xff;
80
server_addr6.sin6_addr.s6_addr[11] = 0xff;
81
memcpy(&server_addr6.sin6_addr.s6_addr[12],
82
&((struct sockaddr_in *)result->ai_addr)->sin_addr,
83
sizeof(struct in_addr));
86
memcpy(&server_addr6.sin6_addr,
87
&((struct sockaddr_in6 *)result->ai_addr)->sin6_addr,
88
sizeof(struct in6_addr));
91
lwsl_err("Unknown address family\n");
100
server_hostent = gethostbyname(ads);
101
if (!server_hostent) {
102
lwsl_err("Unable to get host name from %s\n", ads);
106
server_addr4.sin_family = AF_INET;
107
server_addr4.sin_addr =
108
*((struct in_addr *)server_hostent->h_addr);
109
bzero(&server_addr4.sin_zero, 8);
115
if (LWS_IPV6_ENABLED(context))
116
wsi->sock = socket(AF_INET6, SOCK_STREAM, 0);
119
wsi->sock = socket(AF_INET, SOCK_STREAM, 0);
122
lwsl_warn("Unable to open socket\n");
126
if (lws_plat_set_socket_options(context, wsi->sock)) {
127
lwsl_err("Failed to set wsi socket options\n");
128
compatible_close(wsi->sock);
132
wsi->mode = LWS_CONNMODE_WS_CLIENT_WAITING_CONNECT;
134
insert_wsi_socket_into_fds(context, wsi);
136
libwebsocket_set_timeout(wsi,
137
PENDING_TIMEOUT_AWAITING_CONNECT_RESPONSE,
140
if (LWS_IPV6_ENABLED(context)) {
141
v = (struct sockaddr *)&client_addr6;
142
n = sizeof(client_addr6);
144
client_addr6.sin6_family = AF_INET6;
148
v = (struct sockaddr *)&client_addr4;
149
n = sizeof(client_addr4);
151
client_addr4.sin_family = AF_INET;
154
if (context->iface) {
155
if (interface_to_sa(context, context->iface,
156
(struct sockaddr_in *)v, n) < 0) {
157
lwsl_err("Unable to find interface %s\n",
159
compatible_close(wsi->sock);
163
if (bind(wsi->sock, v, n) < 0) {
164
lwsl_err("Error binding to interface %s",
166
compatible_close(wsi->sock);
173
if (LWS_IPV6_ENABLED(context)) {
174
v = (struct sockaddr *)&server_addr6;
175
n = sizeof(struct sockaddr_in6);
179
v = (struct sockaddr *)&server_addr4;
180
n = sizeof(struct sockaddr);
183
if (connect(wsi->sock, v, n) == -1 || LWS_ERRNO == LWS_EISCONN) {
185
if (LWS_ERRNO == LWS_EALREADY || LWS_ERRNO == LWS_EINPROGRESS
186
|| LWS_ERRNO == LWS_EWOULDBLOCK) {
187
lwsl_client("nonblocking connect retry\n");
190
* must do specifically a POLLOUT poll to hear
191
* about the connect completion
193
if (lws_change_pollfd(wsi, 0, LWS_POLLOUT))
199
if (LWS_ERRNO != LWS_EISCONN) {
200
lwsl_debug("Connect failed errno=%d\n", LWS_ERRNO);
205
lwsl_client("connected\n");
207
/* we are connected to server, or proxy */
209
if (context->http_proxy_port) {
29
211
/* OK from now on we talk via the proxy, so connect to that */
35
217
if (lws_hdr_simple_create(wsi, _WSI_TOKEN_CLIENT_PEER_ADDRESS,
36
218
context->http_proxy_address))
38
wsi->u.hdr.c_port = context->http_proxy_port;
42
* prepare the actual connection (to the proxy, if any)
45
ads = lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_PEER_ADDRESS);
47
lwsl_client("__libwebsocket_client_connect_2: address %s\n", ads);
49
server_hostent = gethostbyname(ads);
50
if (server_hostent == NULL) {
51
lwsl_err("Unable to get host name from %s\n", ads);
55
wsi->sock = socket(AF_INET, SOCK_STREAM, 0);
58
lwsl_warn("Unable to open socket\n");
62
server_addr.sin_family = AF_INET;
63
server_addr.sin_port = htons(wsi->u.hdr.c_port);
64
server_addr.sin_addr = *((struct in_addr *)server_hostent->h_addr);
65
bzero(&server_addr.sin_zero, 8);
67
if (connect(wsi->sock, (struct sockaddr *)&server_addr,
68
sizeof(struct sockaddr)) == -1) {
69
lwsl_debug("Connect failed\n");
70
compatible_close(wsi->sock);
74
lwsl_client("connected\n");
76
if (lws_set_socket_options(context, wsi->sock)) {
77
lwsl_err("Failed to set wsi socket options\n");
82
insert_wsi_socket_into_fds(context, wsi);
84
/* we are connected to server, or proxy */
86
if (context->http_proxy_port) {
88
n = send(wsi->sock, context->service_buffer, plen, 0);
220
wsi->u.hdr.ah->c_port = context->http_proxy_port;
222
n = send(wsi->sock, context->service_buffer, plen, MSG_NOSIGNAL);
90
compatible_close(wsi->sock);
91
224
lwsl_debug("ERROR writing to proxy socket\n");
95
228
libwebsocket_set_timeout(wsi,
239
366
wsi->protocol = &context->protocols[0];
241
#ifndef LWS_NO_EXTENSIONS
243
369
* Check with each extension if it is able to route and proxy this
244
370
* connection for us. For example, an extension like x-google-mux
245
371
* can handle this and then we don't need an actual socket for this
250
ext = context->extensions;
253
while (ext && ext->callback && !handled) {
254
m = ext->callback(context, ext, wsi,
375
if (lws_ext_callback_for_each_extension_type(context, wsi,
255
376
LWS_EXT_CALLBACK_CAN_PROXY_CLIENT_CONNECTION,
256
(void *)(long)n, (void *)address, port);
377
(void *)address, port) > 0) {
265
378
lwsl_client("libwebsocket_client_connect: ext handling conn\n");
267
380
libwebsocket_set_timeout(wsi,