lws_intptr_t
[platform/upstream/libwebsockets.git] / lib / context.c
index 435f48e..666f51e 100644 (file)
@@ -220,10 +220,13 @@ lws_callback_http_dummy(struct lws *wsi, enum lws_callback_reasons reason,
 {
 #ifdef LWS_WITH_CGI
        struct lws_cgi_args *args;
-       char buf[128];
+#endif
+#if defined(LWS_WITH_CGI) || defined(LWS_WITH_HTTP_PROXY)
+       char buf[512];
        int n;
 #endif
 
+
        switch (reason) {
        case LWS_CALLBACK_HTTP:
 #ifndef LWS_NO_SERVER
@@ -241,13 +244,99 @@ lws_callback_http_dummy(struct lws *wsi, enum lws_callback_reasons reason,
                        if (lws_cgi_write_split_stdout_headers(wsi) < 0)
                                return -1;
 
-                       wsi->reason_bf &= ~1;
+                       if (wsi->reason_bf & 8)
+                               wsi->reason_bf &= ~8;
+                       else
+                               wsi->reason_bf &= ~1;
+                       break;
+               }
+#endif
+#if defined(LWS_WITH_HTTP_PROXY)
+               if (wsi->reason_bf & 2) {
+                       char *px = buf + LWS_PRE;
+                       int lenx = sizeof(buf) - LWS_PRE;
+                       /*
+                        * our sink is writeable and our source has something
+                        * to read.  So read a lump of source material of
+                        * suitable size to send or what's available, whichever
+                        * is the smaller.
+                        */
+
+
+                       wsi->reason_bf &= ~2;
+                       if (!lws_get_child(wsi))
+                               break;
+                       if (lws_http_client_read(lws_get_child(wsi), &px, &lenx) < 0)
+                               return -1;
                        break;
                }
 #endif
+               break;
 
+#if defined(LWS_WITH_HTTP_PROXY)
+       case LWS_CALLBACK_RECEIVE_CLIENT_HTTP:
+               //lwsl_err("LWS_CALLBACK_RECEIVE_CLIENT_HTTP: wsi %p\n", wsi);
+               assert(lws_get_parent(wsi));
+               if (!lws_get_parent(wsi))
+                       break;
+               lws_get_parent(wsi)->reason_bf |= 2;
+               lws_callback_on_writable(lws_get_parent(wsi));
                break;
 
+       case LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ:
+               //lwsl_err("LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ len %d\n", (int)len);
+               assert(lws_get_parent(wsi));
+               n = lws_write(lws_get_parent(wsi), (unsigned char *)in,
+                               len, LWS_WRITE_HTTP);
+               if (n < 0)
+                       return -1;
+               break;
+
+       case LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP: {
+               unsigned char *p, *end;
+               char ctype[64], ctlen = 0;
+
+               //lwsl_err("LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP\n");
+       
+               p = (unsigned char *)buf + LWS_PRE;
+               end = p + sizeof(buf) - LWS_PRE;
+
+               if (lws_add_http_header_status(lws_get_parent(wsi), HTTP_STATUS_OK, &p, end))
+                       return 1;
+               if (lws_add_http_header_by_token(lws_get_parent(wsi),
+                               WSI_TOKEN_HTTP_SERVER,
+                               (unsigned char *)"libwebsockets",
+                               13, &p, end))
+                       return 1;
+
+               ctlen = lws_hdr_copy(wsi, ctype, sizeof(ctype), WSI_TOKEN_HTTP_CONTENT_TYPE);
+               if (ctlen > 0) {
+                       if (lws_add_http_header_by_token(lws_get_parent(wsi),
+                               WSI_TOKEN_HTTP_CONTENT_TYPE,
+                               (unsigned char *)ctype, ctlen, &p, end))
+                               return 1;
+               }
+#if 0
+               if (lws_add_http_header_content_length(lws_get_parent(wsi),
+                                                      file_len, &p, end))
+                       return 1;
+#endif
+               if (lws_finalize_http_header(lws_get_parent(wsi), &p, end))
+                       return 1;
+
+               *p = '\0';
+//             lwsl_info("%s\n", buf + LWS_PRE);
+
+               n = lws_write(lws_get_parent(wsi), (unsigned char *)buf + LWS_PRE,
+                             p - ((unsigned char *)buf + LWS_PRE),
+                             LWS_WRITE_HTTP_HEADERS);
+               if (n < 0)
+                       return -1;
+
+               break; }
+
+#endif
+
 #ifdef LWS_WITH_CGI
        /* CGI IO events (POLLIN/OUT) appear here, our default policy is:
         *
@@ -292,6 +381,16 @@ lws_callback_http_dummy(struct lws *wsi, enum lws_callback_reasons reason,
                                    "sent %d only %d went", n, args->len);
                return n;
 #endif
+
+       case LWS_CALLBACK_SSL_INFO:
+               {
+                       struct lws_ssl_info *si = in;
+
+                       lwsl_notice("LWS_CALLBACK_SSL_INFO: where: 0x%x, ret: 0x%x\n",
+                                       si->where, si->ret);
+               }
+               break;
+
        default:
                break;
        }
@@ -352,6 +451,10 @@ lws_create_vhost(struct lws_context *context,
                vh->name = info->vhost_name;
 
        vh->iface = info->iface;
+#if !defined(LWS_WITH_ESP8266) && !defined(LWS_WITH_ESP32) && !defined(OPTEE_TA) && !defined(WIN32)
+       vh->bind_iface = info->bind_iface;
+#endif
+
        for (vh->count_protocols = 0;
             info->protocols[vh->count_protocols].callback;
             vh->count_protocols++)
@@ -360,6 +463,7 @@ lws_create_vhost(struct lws_context *context,
        vh->options = info->options;
        vh->pvo = info->pvo;
        vh->headers = info->headers;
+       vh->ssl_info_event_mask = info->ssl_info_event_mask;
        if (info->keepalive_timeout)
                vh->keepalive_timeout = info->keepalive_timeout;
        else
@@ -438,6 +542,7 @@ lws_create_vhost(struct lws_context *context,
 
        mounts = info->mounts;
        while (mounts) {
+               (void)mount_protocols[0];
                lwsl_notice("   mounting %s%s to %s\n",
                                mount_protocols[mounts->origin_protocol],
                                mounts->origin, mounts->mountpoint);
@@ -448,7 +553,7 @@ lws_create_vhost(struct lws_context *context,
                        for (n = 0; n < vh->count_protocols; n++)
                                if (!strcmp(pvo->value, vh->protocols[n].name)) {
                                        ((struct lws_protocol_vhost_options *)pvo)->value =
-                                                       (const char *)(long)n;
+                                                       (const char *)(lws_intptr_t)n;
                                        break;
                                }
                        if (n == vh->count_protocols)
@@ -497,9 +602,14 @@ lws_create_vhost(struct lws_context *context,
 #if !defined(LWS_WITH_ESP8266)
        vh->http_proxy_port = 0;
        vh->http_proxy_address[0] = '\0';
+#if defined(LWS_WITH_SOCKS5)
+       vh->socks_proxy_port = 0;
+       vh->socks_proxy_address[0] = '\0';
+#endif
 
        /* either use proxy from info, or try get it from env var */
 
+       /* http proxy */
        if (info->http_proxy_address) {
                /* override for backwards compatibility */
                if (info->http_proxy_port)
@@ -512,7 +622,23 @@ lws_create_vhost(struct lws_context *context,
                        lws_set_proxy(vh, p);
 #endif
        }
+#if defined(LWS_WITH_SOCKS5)
+       /* socks proxy */
+       if (info->socks_proxy_address) {
+               /* override for backwards compatibility */
+               if (info->socks_proxy_port)
+                       vh->socks_proxy_port = info->socks_proxy_port;
+               lws_set_socks(vh, info->socks_proxy_address);
+       } else {
+#ifdef LWS_HAVE_GETENV
+               p = getenv("socks_proxy");
+               if (p)
+                       lws_set_socks(vh, p);
+#endif
+       }
+#endif
 #endif
+
        vh->ka_time = info->ka_time;
        vh->ka_interval = info->ka_interval;
        vh->ka_probes = info->ka_probes;
@@ -616,6 +742,9 @@ lws_create_context(struct lws_context_creation_info *info)
        lwsl_info(" LWS_MAX_SMP           : %u\n", LWS_MAX_SMP);
        lwsl_info(" SPEC_LATEST_SUPPORTED : %u\n", SPEC_LATEST_SUPPORTED);
        lwsl_info(" sizeof (*info)        : %ld\n", (long)sizeof(*info));
+#if defined(LWS_WITH_STATS)
+       lwsl_notice(" LWS_WITH_STATS        : on\n");
+#endif
 #if LWS_POSIX
        lwsl_info(" SYSTEM_RANDOM_FILEPATH: '%s'\n", SYSTEM_RANDOM_FILEPATH);
 #endif
@@ -865,6 +994,11 @@ lws_create_context(struct lws_context_creation_info *info)
        context->uid = info->uid;
        context->gid = info->gid;
 
+#if defined(LWS_HAVE_SYS_CAPABILITY_H) && defined(LWS_HAVE_LIBCAP)
+       memcpy(context->caps, info->caps, sizeof(context->caps));
+       context->count_caps = info->count_caps;
+#endif
+
        /*
         * drop any root privs for this process
         * to listen on port < 1023 we would have needed root, but now we are
@@ -1109,12 +1243,13 @@ lws_context_destroy2(struct lws_context *context)
                vh = vh1;
        }
 
+       lws_stats_log_dump(context);
+
        lws_ssl_context_destroy(context);
        lws_plat_context_late_destroy(context);
 
        if (context->external_baggage_free_on_destroy)
                free(context->external_baggage_free_on_destroy);
 
-
        lws_free(context);
 }