proc: expose HTTP Origin header in process environment
[project/uhttpd.git] / listen.c
index 37fc4bb..2a54888 100644 (file)
--- a/listen.c
+++ b/listen.c
@@ -56,8 +56,8 @@ static void uh_poll_listeners(struct uloop_timeout *timeout)
 {
        struct listener *l;
 
-       if ((!n_blocked && conf.max_requests) ||
-           n_clients >= conf.max_requests)
+       if ((!n_blocked && conf.max_connections) ||
+           n_clients >= conf.max_connections)
                return;
 
        list_for_each_entry(l, &listeners, list) {
@@ -65,7 +65,7 @@ static void uh_poll_listeners(struct uloop_timeout *timeout)
                        continue;
 
                l->fd.cb(&l->fd, ULOOP_READ);
-           if (n_clients >= conf.max_requests)
+           if (n_clients >= conf.max_connections)
                        break;
 
                n_blocked--;
@@ -92,7 +92,7 @@ static void listener_cb(struct uloop_fd *fd, unsigned int events)
                        break;
        }
 
-       if (conf.max_requests && n_clients >= conf.max_requests)
+       if (conf.max_connections && n_clients >= conf.max_connections)
                uh_block_listener(l);
 }
 
@@ -107,15 +107,17 @@ void uh_setup_listeners(void)
                /* TCP keep-alive */
                if (conf.tcp_keepalive > 0) {
 #ifdef linux
-                       int tcp_ka_idl, tcp_ka_int, tcp_ka_cnt;
+                       int tcp_ka_idl, tcp_ka_int, tcp_ka_cnt, tcp_fstopn;
 
                        tcp_ka_idl = 1;
                        tcp_ka_cnt = 3;
                        tcp_ka_int = conf.tcp_keepalive;
+                       tcp_fstopn = 5;
 
                        setsockopt(sock, SOL_TCP, TCP_KEEPIDLE,  &tcp_ka_idl, sizeof(tcp_ka_idl));
                        setsockopt(sock, SOL_TCP, TCP_KEEPINTVL, &tcp_ka_int, sizeof(tcp_ka_int));
                        setsockopt(sock, SOL_TCP, TCP_KEEPCNT,   &tcp_ka_cnt, sizeof(tcp_ka_cnt));
+                       setsockopt(sock, SOL_TCP, TCP_FASTOPEN,  &tcp_fstopn, sizeof(tcp_fstopn));
 #endif
 
                        setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &yes, sizeof(yes));
@@ -187,6 +189,7 @@ int uh_socket_bind(const char *host, const char *port, bool tls)
 
                l->fd.fd = sock;
                l->tls = tls;
+               l->addr = *(struct sockaddr_in6 *)p->ai_addr;
                list_add_tail(&l->list, &listeners);
                bound++;
 
@@ -201,3 +204,21 @@ error:
 
        return bound;
 }
+
+int uh_first_tls_port(int family)
+{
+       struct listener *l;
+       int tls_port = -1;
+
+       list_for_each_entry(l, &listeners, list) {
+               if (!l->tls || l->addr.sin6_family != family)
+                       continue;
+
+               if (tls_port != -1 && ntohs(l->addr.sin6_port) != 443)
+                       continue;
+
+               tls_port = ntohs(l->addr.sin6_port);
+       }
+
+       return tls_port;
+}