lws_plat_fd implement platform default handlers
[platform/upstream/libwebsockets.git] / lib / libwebsockets.c
1 /*
2  * libwebsockets - small server side websockets and web server implementation
3  *
4  * Copyright (C) 2010-2014 Andy Green <andy@warmcat.com>
5  *
6  *  This library is free software; you can redistribute it and/or
7  *  modify it under the terms of the GNU Lesser General Public
8  *  License as published by the Free Software Foundation:
9  *  version 2.1 of the License.
10  *
11  *  This library is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  *  Lesser General Public License for more details.
15  *
16  *  You should have received a copy of the GNU Lesser General Public
17  *  License along with this library; if not, write to the Free Software
18  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19  *  MA  02110-1301  USA
20  */
21
22 #include "private-libwebsockets.h"
23
24 int log_level = LLL_ERR | LLL_WARN | LLL_NOTICE;
25 static void (*lwsl_emit)(int level, const char *line) = lwsl_emit_stderr;
26
27 static const char * const log_level_names[] = {
28         "ERR",
29         "WARN",
30         "NOTICE",
31         "INFO",
32         "DEBUG",
33         "PARSER",
34         "HEADER",
35         "EXTENSION",
36         "CLIENT",
37         "LATENCY",
38 };
39
40 void
41 lws_free_wsi(struct lws *wsi)
42 {
43         if (!wsi)
44                 return;
45
46         /* Protocol user data may be allocated either internally by lws
47          * or by specified the user.
48          * We should only free what we allocated. */
49         if (wsi->protocol && wsi->protocol->per_session_data_size &&
50             wsi->user_space && !wsi->user_space_externally_allocated)
51                 lws_free(wsi->user_space);
52
53         lws_free2(wsi->rxflow_buffer);
54         lws_free2(wsi->truncated_send_malloc);
55         lws_free_header_table(wsi);
56         lws_free(wsi);
57 }
58
59 void
60 lws_close_and_free_session(struct lws_context *context,
61                            struct lws *wsi, enum lws_close_status reason)
62 {
63         int n, m, ret, old_state;
64         struct lws_tokens eff_buf;
65         unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + 2 +
66                           LWS_SEND_BUFFER_POST_PADDING];
67
68         if (!wsi)
69                 return;
70
71         old_state = wsi->state;
72
73         if (wsi->mode == LWS_CONNMODE_HTTP_SERVING_ACCEPTED &&
74             wsi->u.http.fd != LWS_INVALID_FILE) {
75                 lwsl_debug("closing http file\n");
76                 lws_plat_file_close(&context->fops, wsi->u.http.fd);
77                 wsi->u.http.fd = LWS_INVALID_FILE;
78                 context->protocols[0].callback(context, wsi,
79                         LWS_CALLBACK_CLOSED_HTTP, wsi->user_space, NULL, 0);
80         }
81         if (wsi->socket_is_permanently_unusable ||
82             reason == LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY)
83                 goto just_kill_connection;
84
85         switch (old_state) {
86         case WSI_STATE_DEAD_SOCKET:
87                 return;
88
89         /* we tried the polite way... */
90         case WSI_STATE_AWAITING_CLOSE_ACK:
91                 goto just_kill_connection;
92
93         case WSI_STATE_FLUSHING_STORED_SEND_BEFORE_CLOSE:
94                 if (wsi->truncated_send_len) {
95                         lws_callback_on_writable(context, wsi);
96                         return;
97                 }
98                 lwsl_info("wsi %p completed WSI_STATE_FLUSHING_STORED_SEND_BEFORE_CLOSE\n", wsi);
99                 goto just_kill_connection;
100         default:
101                 if (wsi->truncated_send_len) {
102                         lwsl_info("wsi %p entering WSI_STATE_FLUSHING_STORED_SEND_BEFORE_CLOSE\n", wsi);
103                         wsi->state = WSI_STATE_FLUSHING_STORED_SEND_BEFORE_CLOSE;
104                         lws_set_timeout(wsi, PENDING_FLUSH_STORED_SEND_BEFORE_CLOSE, 5);
105                         return;
106                 }
107                 break;
108         }
109
110         wsi->u.ws.close_reason = reason;
111
112         if (wsi->mode == LWS_CONNMODE_WS_CLIENT_WAITING_CONNECT ||
113             wsi->mode == LWS_CONNMODE_WS_CLIENT_ISSUE_HANDSHAKE)
114                 goto just_kill_connection;
115
116         if (wsi->mode == LWS_CONNMODE_HTTP_SERVING)
117                 context->protocols[0].callback(context, wsi,
118                         LWS_CALLBACK_CLOSED_HTTP, wsi->user_space, NULL, 0);
119
120         /*
121          * are his extensions okay with him closing?  Eg he might be a mux
122          * parent and just his ch1 aspect is closing?
123          */
124         
125         if (lws_ext_callback_for_each_active(wsi,
126                       LWS_EXT_CALLBACK_CHECK_OK_TO_REALLY_CLOSE, NULL, 0) > 0) {
127                 lwsl_ext("extension vetoed close\n");
128                 return;
129         }
130
131         /*
132          * flush any tx pending from extensions, since we may send close packet
133          * if there are problems with send, just nuke the connection
134          */
135
136         do {
137                 ret = 0;
138                 eff_buf.token = NULL;
139                 eff_buf.token_len = 0;
140
141                 /* show every extension the new incoming data */
142
143                 m = lws_ext_callback_for_each_active(wsi,
144                           LWS_EXT_CALLBACK_FLUSH_PENDING_TX, &eff_buf, 0);
145                 if (m < 0) {
146                         lwsl_ext("Extension reports fatal error\n");
147                         goto just_kill_connection;
148                 }
149                 if (m)
150                         /*
151                          * at least one extension told us he has more
152                          * to spill, so we will go around again after
153                          */
154                         ret = 1;
155
156                 /* assuming they left us something to send, send it */
157
158                 if (eff_buf.token_len)
159                         if (lws_issue_raw(wsi, (unsigned char *)eff_buf.token,
160                                           eff_buf.token_len) !=
161                             eff_buf.token_len) {
162                                 lwsl_debug("close: ext spill failed\n");
163                                 goto just_kill_connection;
164                         }
165         } while (ret);
166
167         /*
168          * signal we are closing, lws_write will
169          * add any necessary version-specific stuff.  If the write fails,
170          * no worries we are closing anyway.  If we didn't initiate this
171          * close, then our state has been changed to
172          * WSI_STATE_RETURNED_CLOSE_ALREADY and we will skip this.
173          *
174          * Likewise if it's a second call to close this connection after we
175          * sent the close indication to the peer already, we are in state
176          * WSI_STATE_AWAITING_CLOSE_ACK and will skip doing this a second time.
177          */
178
179         if (old_state == WSI_STATE_ESTABLISHED &&
180             reason != LWS_CLOSE_STATUS_NOSTATUS &&
181             reason != LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY) {
182
183                 lwsl_debug("sending close indication...\n");
184
185                 /* make valgrind happy */
186                 memset(buf, 0, sizeof(buf));
187                 n = lws_write(wsi, &buf[LWS_SEND_BUFFER_PRE_PADDING + 2],
188                               0, LWS_WRITE_CLOSE);
189                 if (n >= 0) {
190                         /*
191                          * we have sent a nice protocol level indication we
192                          * now wish to close, we should not send anything more
193                          */
194                         wsi->state = WSI_STATE_AWAITING_CLOSE_ACK;
195
196                         /*
197                          * ...and we should wait for a reply for a bit
198                          * out of politeness
199                          */
200                         lws_set_timeout(wsi, PENDING_TIMEOUT_CLOSE_ACK, 1);
201                         lwsl_debug("sent close indication, awaiting ack\n");
202
203                         return;
204                 }
205
206                 lwsl_info("close: sending close packet failed, hanging up\n");
207
208                 /* else, the send failed and we should just hang up */
209         }
210
211 just_kill_connection:
212
213         lwsl_debug("close: just_kill_connection\n");
214
215         /*
216          * we won't be servicing or receiving anything further from this guy
217          * delete socket from the internal poll list if still present
218          */
219         lws_ssl_remove_wsi_from_buffered_list(context, wsi);
220
221         /* checking return redundant since we anyway close */
222         remove_wsi_socket_from_fds(context, wsi);
223
224         wsi->state = WSI_STATE_DEAD_SOCKET;
225
226         lws_free2(wsi->rxflow_buffer);
227         lws_free_header_table(wsi);
228
229         if ((old_state == WSI_STATE_ESTABLISHED ||
230              wsi->mode == LWS_CONNMODE_WS_SERVING ||
231              wsi->mode == LWS_CONNMODE_WS_CLIENT)) {
232
233                 lws_free2(wsi->u.ws.rx_user_buffer);
234
235                 if (wsi->truncated_send_malloc)
236                         /* not going to be completed... nuke it */
237                         lws_free2(wsi->truncated_send_malloc);
238
239                 if (wsi->u.ws.ping_payload_buf) {
240                         lws_free2(wsi->u.ws.ping_payload_buf);
241                         wsi->u.ws.ping_payload_alloc = 0;
242                         wsi->u.ws.ping_payload_len = 0;
243                         wsi->u.ws.ping_pending_flag = 0;
244                 }
245         }
246
247         /* tell the user it's all over for this guy */
248
249         if (wsi->protocol && wsi->protocol->callback &&
250             ((old_state == WSI_STATE_ESTABLISHED) ||
251             (old_state == WSI_STATE_RETURNED_CLOSE_ALREADY) ||
252             (old_state == WSI_STATE_AWAITING_CLOSE_ACK) ||
253             (old_state == WSI_STATE_FLUSHING_STORED_SEND_BEFORE_CLOSE))) {
254                 lwsl_debug("calling back CLOSED\n");
255                 wsi->protocol->callback(context, wsi, LWS_CALLBACK_CLOSED,
256                                         wsi->user_space, NULL, 0);
257         } else if (wsi->mode == LWS_CONNMODE_HTTP_SERVING_ACCEPTED) {
258                 lwsl_debug("calling back CLOSED_HTTP\n");
259                 context->protocols[0].callback(context, wsi,
260                         LWS_CALLBACK_CLOSED_HTTP, wsi->user_space, NULL, 0 );
261         } else if (wsi->mode == LWS_CONNMODE_WS_CLIENT_WAITING_SERVER_REPLY ||
262                    wsi->mode == LWS_CONNMODE_WS_CLIENT_WAITING_CONNECT) {
263                 lwsl_debug("Connection closed before server reply\n");
264                 context->protocols[0].callback(context, wsi,
265                                         LWS_CALLBACK_CLIENT_CONNECTION_ERROR,
266                                         wsi->user_space, NULL, 0);
267         } else
268                 lwsl_debug("not calling back closed mode=%d state=%d\n",
269                            wsi->mode, old_state);
270
271         /* deallocate any active extension contexts */
272         
273         if (lws_ext_callback_for_each_active(wsi, LWS_EXT_CALLBACK_DESTROY,
274                                              NULL, 0) < 0)
275                 lwsl_warn("extension destruction failed\n");
276 #ifndef LWS_NO_EXTENSIONS
277         for (n = 0; n < wsi->count_active_extensions; n++)
278                 lws_free(wsi->active_extensions_user[n]);
279 #endif
280         /*
281          * inform all extensions in case they tracked this guy out of band
282          * even though not active on him specifically
283          */
284         if (lws_ext_callback_for_each_extension_type(context, wsi,
285                        LWS_EXT_CALLBACK_DESTROY_ANY_WSI_CLOSING, NULL, 0) < 0)
286                 lwsl_warn("ext destroy wsi failed\n");
287
288         if (!lws_ssl_close(wsi) && lws_socket_is_valid(wsi->sock)) {
289 #if LWS_POSIX
290                 n = shutdown(wsi->sock, SHUT_RDWR);
291                 if (n)
292                         lwsl_debug("closing: shutdown ret %d\n", LWS_ERRNO);
293
294                 n = compatible_close(wsi->sock);
295                 if (n)
296                         lwsl_debug("closing: close ret %d\n", LWS_ERRNO);
297
298 #else
299                 compatible_close(wsi->sock);
300 #endif
301                 wsi->sock = LWS_SOCK_INVALID;
302         }
303
304         /* outermost destroy notification for wsi (user_space still intact) */
305         context->protocols[0].callback(context, wsi, LWS_CALLBACK_WSI_DESTROY,
306                                        wsi->user_space, NULL, 0);
307
308         lws_free_wsi(wsi);
309 }
310
311 LWS_VISIBLE int
312 lws_get_addresses(struct lws_context *context, void *ads, char *name,
313                   int name_len, char *rip, int rip_len)
314 {
315 #if LWS_POSIX
316         struct addrinfo ai, *res;
317         struct sockaddr_in addr4;
318
319         if (rip)
320                 rip[0] = '\0';
321         name[0] = '\0';
322         addr4.sin_family = AF_UNSPEC;
323
324 #ifdef LWS_USE_IPV6
325         if (LWS_IPV6_ENABLED(context)) {
326                 if (!lws_plat_inet_ntop(AF_INET6, &((struct sockaddr_in6 *)ads)->sin6_addr, rip, rip_len)) {
327                         lwsl_err("inet_ntop", strerror(LWS_ERRNO));
328                         return -1;
329                 }
330
331                 // Strip off the IPv4 to IPv6 header if one exists
332                 if (strncmp(rip, "::ffff:", 7) == 0)
333                         memmove(rip, rip + 7, strlen(rip) - 6);
334
335                 getnameinfo((struct sockaddr *)ads,
336                                 sizeof(struct sockaddr_in6), name,
337                                                         name_len, NULL, 0, 0);
338                 
339                 return 0;
340         } else
341 #endif
342         {
343                 struct addrinfo *result;
344
345                 memset(&ai, 0, sizeof ai);
346                 ai.ai_family = PF_UNSPEC;
347                 ai.ai_socktype = SOCK_STREAM;
348                 ai.ai_flags = AI_CANONNAME;
349
350                 if (getnameinfo((struct sockaddr *)ads,
351                                 sizeof(struct sockaddr_in),
352                                 name, name_len, NULL, 0, 0))
353                         return -1;
354
355                 if (!rip)
356                         return 0;
357
358                 if (getaddrinfo(name, NULL, &ai, &result))
359                         return -1;
360
361                 res = result;
362                 while (addr4.sin_family == AF_UNSPEC && res) {
363                         switch (res->ai_family) {
364                         case AF_INET:
365                                 addr4.sin_addr = ((struct sockaddr_in *)res->ai_addr)->sin_addr;
366                                 addr4.sin_family = AF_INET;
367                                 break;
368                         }
369
370                         res = res->ai_next;
371                 }
372                 freeaddrinfo(result);
373         }
374
375         if (addr4.sin_family == AF_UNSPEC)
376                 return -1;
377
378         lws_plat_inet_ntop(AF_INET, &addr4.sin_addr, rip, rip_len);
379
380         return 0;
381 #else
382         (void)context;
383         (void)ads;
384         (void)name;
385         (void)name_len;
386         (void)rip;
387         (void)rip_len;
388
389         return -1;
390 #endif
391 }
392
393 /**
394  * lws_get_peer_addresses() - Get client address information
395  * @context:    Libwebsockets context
396  * @wsi:        Local struct lws associated with
397  * @fd:         Connection socket descriptor
398  * @name:       Buffer to take client address name
399  * @name_len:   Length of client address name buffer
400  * @rip:        Buffer to take client address IP dotted quad
401  * @rip_len:    Length of client address IP buffer
402  *
403  *      This function fills in @name and @rip with the name and IP of
404  *      the client connected with socket descriptor @fd.  Names may be
405  *      truncated if there is not enough room.  If either cannot be
406  *      determined, they will be returned as valid zero-length strings.
407  */
408
409 LWS_VISIBLE void
410 lws_get_peer_addresses(struct lws_context *context, struct lws *wsi,
411                        lws_sockfd_type fd, char *name, int name_len,
412                        char *rip, int rip_len)
413 {
414 #if LWS_POSIX
415         socklen_t len;
416 #ifdef LWS_USE_IPV6
417         struct sockaddr_in6 sin6;
418 #endif
419         struct sockaddr_in sin4;
420         int ret = -1;
421         void *p;
422
423         rip[0] = '\0';
424         name[0] = '\0';
425
426         lws_latency_pre(context, wsi);
427
428 #ifdef LWS_USE_IPV6
429         if (LWS_IPV6_ENABLED(context)) {
430                 len = sizeof(sin6);
431                 p = &sin6;
432         } else
433 #endif
434         {
435                 len = sizeof(sin4);
436                 p = &sin4;
437         }
438
439         if (getpeername(fd, p, &len) < 0) {
440                 lwsl_warn("getpeername: %s\n", strerror(LWS_ERRNO));
441                 goto bail;
442         }
443         
444         ret = lws_get_addresses(context, p, name, name_len, rip, rip_len);
445
446 bail:
447         lws_latency(context, wsi, "lws_get_peer_addresses", ret, 1);
448 #else
449         (void)context;
450         (void)wsi;
451         (void)fd;
452         (void)name;
453         (void)name_len;
454         (void)rip;
455         (void)rip_len;
456 #endif
457 }
458
459 /**
460  * lws_context_user() - get the user data associated with the context
461  * @context: Websocket context
462  *
463  *      This returns the optional user allocation that can be attached to
464  *      the context the sockets live in at context_create time.  It's a way
465  *      to let all sockets serviced in the same context share data without
466  *      using globals statics in the user code.
467  */
468 LWS_EXTERN void *
469 lws_context_user(struct lws_context *context)
470 {
471         return context->user_space;
472 }
473
474
475 /**
476  * lws_callback_all_protocol() - Callback all connections using
477  *                              the given protocol with the given reason
478  *
479  * @protocol:   Protocol whose connections will get callbacks
480  * @reason:     Callback reason index
481  */
482
483 LWS_VISIBLE int
484 lws_callback_all_protocol(const struct lws_protocols *protocol, int reason)
485 {
486         struct lws_context *context = protocol->owning_server;
487         struct lws *wsi;
488         int n;
489
490         for (n = 0; n < context->fds_count; n++) {
491                 wsi = wsi_from_fd(context, context->fds[n].fd);
492                 if (!wsi)
493                         continue;
494                 if (wsi->protocol == protocol)
495                         protocol->callback(context, wsi,
496                                            reason, wsi->user_space, NULL, 0);
497         }
498
499         return 0;
500 }
501
502 /**
503  * lws_set_timeout() - marks the wsi as subject to a timeout
504  *
505  * You will not need this unless you are doing something special
506  *
507  * @wsi:        Websocket connection instance
508  * @reason:     timeout reason
509  * @secs:       how many seconds
510  */
511
512 LWS_VISIBLE void
513 lws_set_timeout(struct lws *wsi, enum pending_timeout reason, int secs)
514 {
515         time_t now;
516
517         time(&now);
518
519         wsi->pending_timeout_limit = now + secs;
520         wsi->pending_timeout = reason;
521 }
522
523
524 #if LWS_POSIX
525
526 /**
527  * lws_get_socket_fd() - returns the socket file descriptor
528  *
529  * You will not need this unless you are doing something special
530  *
531  * @wsi:        Websocket connection instance
532  */
533
534 LWS_VISIBLE int
535 lws_get_socket_fd(struct lws *wsi)
536 {
537         return wsi->sock;
538 }
539
540 #endif
541
542 #ifdef LWS_LATENCY
543 void
544 lws_latency(struct lws_context *context, struct lws *wsi, const char *action,
545             int ret, int completed)
546 {
547         unsigned long long u;
548         char buf[256];
549
550         u = time_in_microseconds();
551
552         if (!action) {
553                 wsi->latency_start = u;
554                 if (!wsi->action_start)
555                         wsi->action_start = u;
556                 return;
557         }
558         if (completed) {
559                 if (wsi->action_start == wsi->latency_start)
560                         sprintf(buf,
561                           "Completion first try lat %lluus: %p: ret %d: %s\n",
562                                         u - wsi->latency_start,
563                                                       (void *)wsi, ret, action);
564                 else
565                         sprintf(buf,
566                           "Completion %lluus: lat %lluus: %p: ret %d: %s\n",
567                                 u - wsi->action_start,
568                                         u - wsi->latency_start,
569                                                       (void *)wsi, ret, action);
570                 wsi->action_start = 0;
571         } else
572                 sprintf(buf, "lat %lluus: %p: ret %d: %s\n",
573                               u - wsi->latency_start, (void *)wsi, ret, action);
574
575         if (u - wsi->latency_start > context->worst_latency) {
576                 context->worst_latency = u - wsi->latency_start;
577                 strcpy(context->worst_latency_info, buf);
578         }
579         lwsl_latency("%s", buf);
580 }
581 #endif
582
583
584
585 /**
586  * lws_rx_flow_control() - Enable and disable socket servicing for
587  *                              received packets.
588  *
589  * If the output side of a server process becomes choked, this allows flow
590  * control for the input side.
591  *
592  * @wsi:        Websocket connection instance to get callback for
593  * @enable:     0 = disable read servicing for this connection, 1 = enable
594  */
595
596 LWS_VISIBLE int
597 lws_rx_flow_control(struct lws *wsi, int enable)
598 {
599         if (enable == (wsi->rxflow_change_to & LWS_RXFLOW_ALLOW))
600                 return 0;
601
602         lwsl_info("%s: (0x%p, %d)\n", __func__, wsi, enable);
603         wsi->rxflow_change_to = LWS_RXFLOW_PENDING_CHANGE | !!enable;
604
605         return 0;
606 }
607
608 /**
609  * lws_rx_flow_allow_all_protocol() - Allow all connections with this protocol to receive
610  *
611  * When the user server code realizes it can accept more input, it can
612  * call this to have the RX flow restriction removed from all connections using
613  * the given protocol.
614  *
615  * @protocol:   all connections using this protocol will be allowed to receive
616  */
617
618 LWS_VISIBLE void
619 lws_rx_flow_allow_all_protocol(const struct lws_protocols *protocol)
620 {
621         struct lws_context *context = protocol->owning_server;
622         int n;
623         struct lws *wsi;
624
625         for (n = 0; n < context->fds_count; n++) {
626                 wsi = wsi_from_fd(context, context->fds[n].fd);
627                 if (!wsi)
628                         continue;
629                 if (wsi->protocol == protocol)
630                         lws_rx_flow_control(wsi, LWS_RXFLOW_ALLOW);
631         }
632 }
633
634
635 /**
636  * lws_canonical_hostname() - returns this host's hostname
637  *
638  * This is typically used by client code to fill in the host parameter
639  * when making a client connection.  You can only call it after the context
640  * has been created.
641  *
642  * @context:    Websocket context
643  */
644 LWS_VISIBLE extern const char *
645 lws_canonical_hostname(struct lws_context *context)
646 {
647         return (const char *)context->canonical_hostname;
648 }
649
650 int user_callback_handle_rxflow(callback_function callback_function,
651                                 struct lws_context *context, struct lws *wsi,
652                                 enum lws_callback_reasons reason, void *user,
653                                 void *in, size_t len)
654 {
655         int n;
656
657         n = callback_function(context, wsi, reason, user, in, len);
658         if (!n)
659                 n = _lws_rx_flow_control(wsi);
660
661         return n;
662 }
663
664
665 /**
666  * lws_set_proxy() - Setups proxy to lws_context.
667  * @context:    pointer to struct lws_context you want set proxy to
668  * @proxy: pointer to c string containing proxy in format address:port
669  *
670  * Returns 0 if proxy string was parsed and proxy was setup. 
671  * Returns -1 if @proxy is NULL or has incorrect format.
672  *
673  * This is only required if your OS does not provide the http_proxy
674  * environment variable (eg, OSX)
675  *
676  *   IMPORTANT! You should call this function right after creation of the
677  *   lws_context and before call to connect. If you call this
678  *   function after connect behavior is undefined.
679  *   This function will override proxy settings made on lws_context
680  *   creation with genenv() call.
681  */
682
683 LWS_VISIBLE int
684 lws_set_proxy(struct lws_context *context, const char *proxy)
685 {
686         char *p;
687         char authstring[96];
688         
689         if (!proxy)
690                 return -1;
691
692         p = strchr(proxy, '@');
693         if (p) { /* auth is around */
694
695                 if ((unsigned int)(p - proxy) > sizeof(authstring) - 1)
696                         goto auth_too_long;
697
698                 strncpy(authstring, proxy, p - proxy);
699                 // null termination not needed on input
700                 if (lws_b64_encode_string(authstring, (p - proxy),
701                     context->proxy_basic_auth_token,
702                     sizeof context->proxy_basic_auth_token) < 0)
703                         goto auth_too_long;
704
705                 lwsl_notice(" Proxy auth in use\n");
706                         
707                 proxy = p + 1;
708         } else
709                 context->proxy_basic_auth_token[0] = '\0';
710
711         strncpy(context->http_proxy_address, proxy,
712                                 sizeof(context->http_proxy_address) - 1);
713         context->http_proxy_address[
714                                 sizeof(context->http_proxy_address) - 1] = '\0';
715
716         p = strchr(context->http_proxy_address, ':');
717         if (!p && !context->http_proxy_port) {
718                 lwsl_err("http_proxy needs to be ads:port\n");
719
720                 return -1;
721         } else {
722                 if (p) {
723                         *p = '\0';
724                         context->http_proxy_port = atoi(p + 1);
725                 }
726         }
727
728         lwsl_notice(" Proxy %s:%u\n", context->http_proxy_address,
729                                                 context->http_proxy_port);
730
731         return 0;
732
733 auth_too_long:
734         lwsl_err("proxy auth too long\n");
735
736         return -1;
737 }
738
739 /**
740  * lws_get_protocol() - Returns a protocol pointer from a websocket
741  *                                connection.
742  * @wsi:        pointer to struct websocket you want to know the protocol of
743  *
744  *
745  *      Some apis can act on all live connections of a given protocol,
746  *      this is how you can get a pointer to the active protocol if needed.
747  */
748
749 LWS_VISIBLE const struct lws_protocols *
750 lws_get_protocol(struct lws *wsi)
751 {
752         return wsi->protocol;
753 }
754
755 LWS_VISIBLE int
756 lws_is_final_fragment(struct lws *wsi)
757 {
758         return wsi->u.ws.final;
759 }
760
761 LWS_VISIBLE unsigned char
762 lws_get_reserved_bits(struct lws *wsi)
763 {
764         return wsi->u.ws.rsv;
765 }
766
767 int
768 lws_ensure_user_space(struct lws *wsi)
769 {
770         lwsl_info("%s: %p protocol %p\n", __func__, wsi, wsi->protocol);
771         if (!wsi->protocol)
772                 return 1;
773
774         /* allocate the per-connection user memory (if any) */
775
776         if (wsi->protocol->per_session_data_size && !wsi->user_space) {
777                 wsi->user_space = lws_zalloc(wsi->protocol->per_session_data_size);
778                 if (wsi->user_space  == NULL) {
779                         lwsl_err("Out of memory for conn user space\n");
780                         return 1;
781                 }
782         } else
783                 lwsl_info("%s: %p protocol pss %u, user_space=%d\n",
784                           __func__, wsi, wsi->protocol->per_session_data_size,
785                           wsi->user_space);
786         return 0;
787 }
788
789 #if LWS_POSIX
790 LWS_VISIBLE void lwsl_emit_stderr(int level, const char *line)
791 {
792         unsigned long long now;
793         char buf[300];
794         int n;
795
796         buf[0] = '\0';
797         for (n = 0; n < LLL_COUNT; n++) {
798                 if (level != (1 << n))
799                         continue;
800                 now = time_in_microseconds() / 100;
801                 sprintf(buf, "[%llu:%04d] %s: ",
802                         (unsigned long long) now / 10000,
803                         (int)(now % 10000), log_level_names[n]);
804                 break;
805         }
806
807         fprintf(stderr, "%s%s", buf, line);
808 }
809 #endif
810
811 LWS_VISIBLE void _lws_logv(int filter, const char *format, va_list vl)
812 {
813         char buf[256];
814
815         if (!(log_level & filter))
816                 return;
817
818         vsnprintf(buf, sizeof(buf), format, vl);
819         buf[sizeof(buf) - 1] = '\0';
820
821         lwsl_emit(filter, buf);
822 }
823
824 LWS_VISIBLE void _lws_log(int filter, const char *format, ...)
825 {
826         va_list ap;
827
828         va_start(ap, format);
829         _lws_logv(filter, format, ap);
830         va_end(ap);
831 }
832
833 /**
834  * lws_set_log_level() - Set the logging bitfield
835  * @level:      OR together the LLL_ debug contexts you want output from
836  * @log_emit_function:  NULL to leave it as it is, or a user-supplied
837  *                      function to perform log string emission instead of
838  *                      the default stderr one.
839  *
840  *      log level defaults to "err", "warn" and "notice" contexts enabled and
841  *      emission on stderr.
842  */
843
844 LWS_VISIBLE void lws_set_log_level(int level,
845                                    void (*func)(int level, const char *line))
846 {
847         log_level = level;
848         if (func)
849                 lwsl_emit = func;
850 }
851
852 /**
853  * lws_use_ssl() - Find out if connection is using SSL
854  * @wsi:        websocket connection to check
855  *
856  *      Returns 0 if the connection is not using SSL, 1 if using SSL and
857  *      using verified cert, and 2 if using SSL but the cert was not
858  *      checked (appears for client wsi told to skip check on connection)
859  */
860 LWS_VISIBLE int
861 lws_is_ssl(struct lws *wsi)
862 {
863 #ifdef LWS_OPENSSL_SUPPORT
864         return wsi->use_ssl;
865 #else
866         (void)wsi;
867         return 0;
868 #endif
869 }
870
871 /**
872  * lws_partial_buffered() - find out if lws buffered the last write
873  * @wsi:        websocket connection to check
874  *
875  * Returns 1 if you cannot use lws_write because the last
876  * write on this connection is still buffered, and can't be cleared without
877  * returning to the service loop and waiting for the connection to be
878  * writeable again.
879  * 
880  * If you will try to do >1 lws_write call inside a single
881  * WRITEABLE callback, you must check this after every write and bail if
882  * set, ask for a new writeable callback and continue writing from there.
883  * 
884  * This is never set at the start of a writeable callback, but any write
885  * may set it.
886  */
887
888 LWS_VISIBLE int
889 lws_partial_buffered(struct lws *wsi)
890 {
891         return !!wsi->truncated_send_len;       
892 }
893
894 void lws_set_protocol_write_pending(struct lws_context *context,
895                                     struct lws *wsi,
896                                     enum lws_pending_protocol_send pend)
897 {
898         lwsl_info("setting pps %d\n", pend);
899         
900         if (wsi->pps)
901                 lwsl_err("pps overwrite\n");
902         wsi->pps = pend;
903         lws_rx_flow_control(wsi, 0);
904         lws_callback_on_writable(context, wsi);
905 }
906
907 LWS_VISIBLE size_t
908 lws_get_peer_write_allowance(struct lws *wsi)
909 {
910 #ifdef LWS_USE_HTTP2
911         /* only if we are using HTTP2 on this connection */
912         if (wsi->mode != LWS_CONNMODE_HTTP2_SERVING)
913                 return -1;
914         /* user is only interested in how much he can send, or that he can't  */
915         if (wsi->u.http2.tx_credit <= 0)
916                 return 0;
917         
918         return wsi->u.http2.tx_credit;
919 #else
920         (void)wsi;
921         return -1;
922 #endif
923 }
924
925 LWS_VISIBLE void
926 lws_union_transition(struct lws *wsi, enum connection_mode mode)
927 {
928         memset(&wsi->u, 0, sizeof(wsi->u));
929         wsi->mode = mode;
930 }
931
932 LWS_VISIBLE struct lws_plat_file_ops *
933 lws_get_fops(struct lws_context *context)
934 {
935         return &context->fops;
936 }
937
938 #ifdef LWS_WITH_OLD_API_WRAPPERS
939
940 /*
941  * To maintain .so abi, also produce wrappers using old api naming.
942  *
943  * This is disabled by default, use "LWS_WITH_OLD_API_WRAPPERS" on cmake to
944  * enable.
945  *
946  * You only need these if you have existing binary applications using the old
947  * api names and you don't want to / can't recompile them against new lws.
948  * With these new lws .so is compatible with old and new api names.
949  *
950  * If you can recompile your application (using old api names still) against
951  * current lws, you don't need these compatibility helpers since
952  * libwebsockets.h will map them at compile time.
953  */
954
955 #undef libwebsocket
956
957 #undef libwebsocket_create_context
958 LWS_VISIBLE LWS_EXTERN struct lws_context *
959 libwebsocket_create_context(struct lws_context_creation_info *info)
960 {
961         return lws_create_context(info);
962 }
963
964 #undef libwebsocket_set_proxy
965 LWS_VISIBLE LWS_EXTERN int
966 libwebsocket_set_proxy(struct lws_context *context, const char *proxy)
967 {
968         return lws_set_proxy(context, proxy);
969 }
970
971 #undef libwebsocket_context_destroy
972 LWS_VISIBLE LWS_EXTERN void
973 libwebsocket_context_destroy(struct lws_context *context)
974 {
975         lws_context_destroy(context);
976 }
977
978 #undef libwebsocket_service
979 LWS_VISIBLE LWS_EXTERN int
980 libwebsocket_service(struct lws_context *context, int timeout_ms)
981 {
982         return lws_service(context, timeout_ms);
983 }
984
985 #undef libwebsocket_cancel_service
986 LWS_VISIBLE LWS_EXTERN void
987 libwebsocket_cancel_service(struct lws_context *context)
988 {
989         lws_cancel_service(context);
990 }
991
992 #ifdef LWS_USE_LIBEV
993 #undef libwebsocket_sigint_cfg
994 LWS_VISIBLE LWS_EXTERN int
995 libwebsocket_sigint_cfg(struct lws_context *context, int use_ev_sigint,
996                         lws_ev_signal_cb* cb)
997 {
998         return lws_sigint_cfg(context, use_ev_sigint, cb);
999 }
1000
1001 #undef libwebsocket_initloop
1002 LWS_VISIBLE LWS_EXTERN int
1003 libwebsocket_initloop(struct lws_context *context, struct ev_loop *loop)
1004 {
1005         return lws_initloop(context, loop);
1006 }
1007
1008 #undef libwebsocket_sigint_cb
1009 LWS_VISIBLE void
1010 libwebsocket_sigint_cb(
1011         struct ev_loop *loop, struct ev_signal *watcher, int revents)
1012 {
1013         lws_sigint_cb(loop, watcher, revents);
1014 }
1015 #endif /* LWS_USE_LIBEV */
1016
1017 #undef libwebsocket_service_fd
1018 LWS_VISIBLE LWS_EXTERN int
1019 libwebsocket_service_fd(struct lws_context *context,
1020                 struct lws_pollfd *pollfd)
1021 {
1022         return lws_service_fd(context, pollfd);
1023 }
1024
1025 #undef libwebsocket_context_user
1026 LWS_VISIBLE LWS_EXTERN void *
1027 libwebsocket_context_user(struct lws_context *context)
1028 {
1029         return lws_context_user(context);
1030 }
1031
1032 #undef libwebsocket_set_timeout
1033 LWS_VISIBLE LWS_EXTERN void
1034 libwebsocket_set_timeout(struct lws *wsi,
1035                                          enum pending_timeout reason, int secs)
1036 {
1037         lws_set_timeout(wsi, reason, secs);
1038 }
1039
1040 #undef libwebsocket_write
1041 LWS_VISIBLE LWS_EXTERN int
1042 libwebsocket_write(struct lws *wsi, unsigned char *buf, size_t len,
1043                                      enum lws_write_protocol protocol)
1044 {
1045         return lws_write(wsi, buf, len, protocol);
1046 }
1047
1048 #undef libwebsockets_serve_http_file_fragment
1049 LWS_VISIBLE LWS_EXTERN int
1050 libwebsockets_serve_http_file_fragment(struct lws_context *context,
1051                         struct lws *wsi)
1052 {
1053         return lws_serve_http_file_fragment(context, wsi);
1054 }
1055
1056 #undef libwebsockets_serve_http_file
1057 LWS_VISIBLE LWS_EXTERN int
1058 libwebsockets_serve_http_file(struct lws_context *context,
1059                         struct lws *wsi, const char *file,
1060                         const char *content_type, const char *other_headers,
1061                         int other_headers_len)
1062 {
1063         return lws_serve_http_file(context, wsi, file, content_type,
1064                         other_headers, other_headers_len);
1065 }
1066
1067 #undef libwebsockets_return_http_status
1068 LWS_VISIBLE LWS_EXTERN int
1069 libwebsockets_return_http_status(
1070                 struct lws_context *context,
1071                         struct lws *wsi, unsigned int code,
1072                                                         const char *html_body)
1073 {
1074         return lws_return_http_status(context, wsi, code, html_body);
1075 }
1076
1077 #undef libwebsockets_get_protocol
1078 LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
1079 libwebsockets_get_protocol(struct lws *wsi)
1080 {
1081         return lws_get_protocol(wsi);
1082 }
1083
1084 #undef libwebsocket_callback_on_writable_all_protocol
1085 LWS_VISIBLE LWS_EXTERN int
1086 libwebsocket_callback_on_writable_all_protocol(
1087                                  const struct lws_protocols *protocol)
1088 {
1089         return lws_callback_on_writable_all_protocol(protocol);
1090 }
1091
1092 #undef libwebsocket_callback_on_writable
1093 LWS_VISIBLE LWS_EXTERN int
1094 libwebsocket_callback_on_writable(struct lws_context *context,
1095                                                       struct lws *wsi)
1096 {
1097         return lws_callback_on_writable(context, wsi);
1098 }
1099
1100 #undef libwebsocket_callback_all_protocol
1101 LWS_VISIBLE LWS_EXTERN int
1102 libwebsocket_callback_all_protocol(
1103                 const struct lws_protocols *protocol, int reason)
1104 {
1105         return lws_callback_all_protocol(protocol, reason);
1106 }
1107
1108 #undef libwebsocket_get_socket_fd
1109 LWS_VISIBLE LWS_EXTERN int
1110 libwebsocket_get_socket_fd(struct lws *wsi)
1111 {
1112         return lws_get_socket_fd(wsi);
1113 }
1114
1115 #undef libwebsocket_is_final_fragment
1116 LWS_VISIBLE LWS_EXTERN int
1117 libwebsocket_is_final_fragment(struct lws *wsi)
1118 {
1119         return lws_is_final_fragment(wsi);
1120 }
1121
1122 #undef libwebsocket_get_reserved_bits
1123 LWS_VISIBLE LWS_EXTERN unsigned char
1124 libwebsocket_get_reserved_bits(struct lws *wsi)
1125 {
1126         return lws_get_reserved_bits(wsi);
1127 }
1128
1129 #undef libwebsocket_rx_flow_control
1130 LWS_VISIBLE LWS_EXTERN int
1131 libwebsocket_rx_flow_control(struct lws *wsi, int enable)
1132 {
1133         return lws_rx_flow_control(wsi, enable);
1134 }
1135
1136 #undef libwebsocket_rx_flow_allow_all_protocol
1137 LWS_VISIBLE LWS_EXTERN void
1138 libwebsocket_rx_flow_allow_all_protocol(const struct lws_protocols *protocol)
1139 {
1140         lws_rx_flow_allow_all_protocol(protocol);
1141 }
1142
1143 #undef libwebsockets_remaining_packet_payload
1144 LWS_VISIBLE LWS_EXTERN size_t
1145 libwebsockets_remaining_packet_payload(struct lws *wsi)
1146 {
1147         return lws_remaining_packet_payload(wsi);
1148 }
1149
1150 #undef libwebsocket_client_connect
1151 LWS_VISIBLE LWS_EXTERN struct lws *
1152 libwebsocket_client_connect(struct lws_context *clients,
1153                               const char *address,
1154                               int port,
1155                               int ssl_connection,
1156                               const char *path,
1157                               const char *host,
1158                               const char *origin,
1159                               const char *protocol,
1160                               int ietf_version_or_minus_one)
1161 {
1162         return lws_client_connect(clients, address, port, ssl_connection,
1163                         path, host, origin, protocol, ietf_version_or_minus_one);
1164 }
1165 LWS_VISIBLE LWS_EXTERN struct lws *
1166 libwebsocket_client_connect_extended(struct lws_context *clients,
1167                               const char *address,
1168                               int port,
1169                               int ssl_connection,
1170                               const char *path,
1171                               const char *host,
1172                               const char *origin,
1173                               const char *protocol,
1174                               int ietf_version_or_minus_one, void *userdata)
1175 {
1176         return lws_client_connect_extended(clients, address, port, ssl_connection,
1177                         path, host, origin, protocol, ietf_version_or_minus_one,
1178                         userdata);
1179 }
1180
1181 #undef libwebsocket_canonical_hostname
1182 LWS_VISIBLE LWS_EXTERN const char *
1183 libwebsocket_canonical_hostname(struct lws_context *context)
1184 {
1185         return lws_canonical_hostname(context);
1186 }
1187
1188 #undef libwebsockets_get_peer_addresses
1189 LWS_VISIBLE LWS_EXTERN void
1190 libwebsockets_get_peer_addresses(struct lws_context *context,
1191                 struct lws *wsi, lws_sockfd_type fd, char *name,
1192                 int name_len, char *rip, int rip_len)
1193 {
1194         lws_get_peer_addresses(context, wsi, fd, name, name_len, rip, rip_len);
1195 }
1196
1197 #undef libwebsockets_get_random
1198 LWS_VISIBLE LWS_EXTERN int
1199 libwebsockets_get_random(struct lws_context *context, void *buf, int len)
1200 {
1201         return lws_get_random(context, buf, len);
1202 }
1203
1204 #ifndef LWS_SHA1_USE_OPENSSL_NAME
1205 #undef libwebsockets_SHA1
1206 LWS_VISIBLE LWS_EXTERN unsigned char *
1207 libwebsockets_SHA1(const unsigned char *d, size_t n, unsigned char *md)
1208 {
1209         return lws_SHA1(d, n, md);
1210 }
1211 #endif
1212
1213 #undef libwebsocket_read
1214 LWS_VISIBLE LWS_EXTERN int
1215 libwebsocket_read(struct lws_context *context, struct lws *wsi,
1216          unsigned char *buf, size_t len)
1217 {
1218         return lws_read(context, wsi, buf, len);
1219 }
1220
1221 #ifndef LWS_NO_EXTENSIONS
1222 #undef libwebsocket_get_internal_extensions
1223 LWS_VISIBLE LWS_EXTERN struct lws_extension *
1224 libwebsocket_get_internal_extensions()
1225 {
1226         return lws_get_internal_extensions();
1227 }
1228 #endif
1229
1230 #endif
1231