362 listener->session_handler = create_event_session_handler(pool); |
362 listener->session_handler = create_event_session_handler(pool); |
363 } |
363 } |
364 listener->nacceptors = conf->nacceptors; |
364 listener->nacceptors = conf->nacceptors; |
365 listener->port = conf->port; |
365 listener->port = conf->port; |
366 listener->next = NULL; |
366 listener->next = NULL; |
367 listener->ssl = NULL; |
367 //listener->ssl = NULL; |
368 |
368 |
369 // create sockets |
369 // create sockets |
370 listener->server_socket = get_socket(conf, LISTENER_PROTO_IPV4); |
370 listener->server_socket = get_socket(conf, LISTENER_PROTO_IPV4); |
371 listener->server_socket6 = get_socket(conf, LISTENER_PROTO_IPV6); |
371 listener->server_socket6 = get_socket(conf, LISTENER_PROTO_IPV6); |
372 if(!listener->server_socket && !listener->server_socket6) { |
372 if(!listener->server_socket && !listener->server_socket6) { |
593 |
593 |
594 ConnectionAddr ca; |
594 ConnectionAddr ca; |
595 struct sockaddr *ca_ptr; |
595 struct sockaddr *ca_ptr; |
596 socklen_t ca_length; |
596 socklen_t ca_length; |
597 ConnectionAddrType addr_type; |
597 ConnectionAddrType addr_type; |
|
598 HttpSSL *socket_ssl = NULL; |
598 if(acceptor->ipv6) { |
599 if(acceptor->ipv6) { |
599 server_socket = listener->server_socket6->socket; |
600 server_socket = listener->server_socket6->socket; |
600 ca_ptr = (struct sockaddr*)&ca.address_v6; |
601 ca_ptr = (struct sockaddr*)&ca.address_v6; |
601 ca_length = sizeof(ca.address_v6); |
602 ca_length = sizeof(ca.address_v6); |
602 addr_type = CONN_ADDR_IPV6; |
603 addr_type = CONN_ADDR_IPV6; |
|
604 socket_ssl = listener->server_socket6->ssl; |
603 } else { |
605 } else { |
604 server_socket = listener->server_socket->socket; |
606 server_socket = listener->server_socket->socket; |
605 ca_ptr = (struct sockaddr*)&ca.address_v4; |
607 ca_ptr = (struct sockaddr*)&ca.address_v4; |
606 ca_length = sizeof(ca.address_v4); |
608 ca_length = sizeof(ca.address_v4); |
607 addr_type = CONN_ADDR_IPV4; |
609 addr_type = CONN_ADDR_IPV4; |
|
610 socket_ssl = listener->server_socket->ssl; |
608 } |
611 } |
609 |
612 |
610 log_ereport(LOG_DEBUG, "acceptor: %p listener: %p start", acceptor, acceptor->listener); |
613 log_ereport(LOG_DEBUG, "acceptor: %p listener: %p start", acceptor, acceptor->listener); |
611 ws_atomic_inc32(acceptors_running); |
614 ws_atomic_inc32(acceptors_running); |
612 |
615 |
644 conn->address = ca; |
647 conn->address = ca; |
645 conn->addr_type = addr_type; |
648 conn->addr_type = addr_type; |
646 conn->fd = clientfd; |
649 conn->fd = clientfd; |
647 conn->listener = ls; |
650 conn->listener = ls; |
648 conn->ssl_accepted = 0; |
651 conn->ssl_accepted = 0; |
649 if(ls->ssl) { |
652 if(socket_ssl) { |
650 // SSL connections are always non-blocking |
653 // SSL connections are always non-blocking |
651 // set socket non blocking |
654 // set socket non blocking |
652 int flags; |
655 int flags; |
653 if((flags = fcntl(conn->fd, F_GETFL, 0)) == -1) { |
656 if((flags = fcntl(conn->fd, F_GETFL, 0)) == -1) { |
654 flags = 0; |
657 flags = 0; |
657 log_ereport(LOG_FAILURE, "acceptor: fcntl failed: %s", strerror(errno)); |
660 log_ereport(LOG_FAILURE, "acceptor: fcntl failed: %s", strerror(errno)); |
658 close(clientfd); |
661 close(clientfd); |
659 free(conn); |
662 free(conn); |
660 conn = NULL; |
663 conn = NULL; |
661 } else { |
664 } else { |
662 SSL *ssl = SSL_new(ls->ssl->sslctx); |
665 SSL *ssl = SSL_new(socket_ssl->sslctx); |
663 if(ssl) { |
666 if(ssl) { |
664 SSL_set_fd(ssl, clientfd); |
667 SSL_set_fd(ssl, clientfd); |
665 |
668 |
666 conn->ssl = ssl; |
669 conn->ssl = ssl; |
667 conn->read = connection_ssl_read; |
670 conn->read = connection_ssl_read; |