[core] get port from sock_addr if AF_INET,AF_INET6

sock_addr_get_port() to get port from sock_addr if AF_INET or AF_INET6,
or else return 0
This commit is contained in:
Glenn Strauss 2017-06-15 01:10:43 -04:00
parent d15ddcb6fa
commit 55867b5602
4 changed files with 34 additions and 26 deletions

View File

@ -213,14 +213,6 @@ int config_insert_values_global(server *srv, array *ca, const config_values_t cv
return config_insert_values_internal(srv, ca, cv, scope);
}
static unsigned short sock_addr_get_port(sock_addr *addr) {
#ifdef HAVE_IPV6
return ntohs(addr->plain.sa_family ? addr->ipv6.sin6_port : addr->ipv4.sin_port);
#else
return ntohs(addr->ipv4.sin_port);
#endif
}
static const char* cond_result_to_string(cond_result_t cond_result) {
switch (cond_result) {
case COND_RESULT_UNSET: return "unset";
@ -415,6 +407,7 @@ static cond_result_t config_check_cond_nocache(server *srv, connection *con, dat
switch (dc->comp) {
case COMP_HTTP_HOST: {
char *ck_colon = NULL, *val_colon = NULL;
unsigned short port;
if (!buffer_string_is_empty(con->uri.authority)) {
@ -427,6 +420,19 @@ static cond_result_t config_check_cond_nocache(server *srv, connection *con, dat
switch(dc->cond) {
case CONFIG_COND_NE:
case CONFIG_COND_EQ:
switch (srv_sock->addr.plain.sa_family) {
case AF_INET:
port = ntohs(srv_sock->addr.ipv4.sin_port);
break;
#ifdef HAVE_IPV6
case AF_INET6:
port = ntohs(srv_sock->addr.ipv6.sin6_port);
break;
#endif
default:
port = 0;
}
if (0 == port) break;
ck_colon = strchr(dc->string->ptr, ':');
val_colon = strchr(l->ptr, ':');
@ -434,7 +440,7 @@ static cond_result_t config_check_cond_nocache(server *srv, connection *con, dat
/* condition "host:port" but client send "host" */
buffer_copy_buffer(srv->cond_check_buf, l);
buffer_append_string_len(srv->cond_check_buf, CONST_STR_LEN(":"));
buffer_append_int(srv->cond_check_buf, sock_addr_get_port(&(srv_sock->addr)));
buffer_append_int(srv->cond_check_buf, port);
l = srv->cond_check_buf;
} else if (NULL != val_colon && NULL == ck_colon) {
/* condition "host" but client send "host:port" */

View File

@ -1419,7 +1419,6 @@ int http_cgi_headers (server *srv, connection *con, http_cgi_opts *opts, http_cg
/* CGI-SPEC 6.1.2, FastCGI spec 6.3 and SCGI spec */
int rc = 0;
unsigned short port;
server_socket *srv_sock = con->srv_socket;
const char *s;
size_t n;
@ -1562,14 +1561,7 @@ int http_cgi_headers (server *srv, connection *con, http_cgi_opts *opts, http_cg
}
addr = &srv_sock->addr;
#ifdef HAVE_IPV6
port = addr->plain.sa_family == AF_INET6
? addr->ipv6.sin6_port
: addr->ipv4.sin_port;
#else
port = addr->ipv4.sin_port;
#endif
li_utostrn(buf, sizeof(buf), ntohs(port));
li_utostrn(buf, sizeof(buf), sock_addr_get_port(addr));
rc |= cb(vdata, CONST_STR_LEN("SERVER_PORT"), buf, strlen(buf));
switch (addr->plain.sa_family) {
@ -1629,14 +1621,7 @@ int http_cgi_headers (server *srv, connection *con, http_cgi_opts *opts, http_cg
rc |= cb(vdata, CONST_STR_LEN("REMOTE_ADDR"),
CONST_BUF_LEN(con->dst_addr_buf));
#ifdef HAVE_IPV6
port = con->dst_addr.plain.sa_family == AF_INET6
? con->dst_addr.ipv6.sin6_port
: con->dst_addr.ipv4.sin_port;
#else
port = con->dst_addr.ipv4.sin_port;
#endif
li_utostrn(buf, sizeof(buf), ntohs(port));
li_utostrn(buf, sizeof(buf), sock_addr_get_port(&con->dst_addr));
rc |= cb(vdata, CONST_STR_LEN("REMOTE_PORT"), buf, strlen(buf));
for (n = 0; n < con->request.headers->used; n++) {

View File

@ -9,6 +9,21 @@
#include <string.h>
unsigned short sock_addr_get_port (const sock_addr *addr)
{
switch (addr->plain.sa_family) {
case AF_INET:
return ntohs(addr->ipv4.sin_port);
#ifdef HAVE_IPV6
case AF_INET6:
return ntohs(addr->ipv6.sin6_port);
#endif
default: /* case AF_UNIX: */
return 0;
}
}
int sock_addr_inet_pton(sock_addr *addr, const char *str,
int family, unsigned short port)
{

View File

@ -4,6 +4,8 @@
#include "base.h"
unsigned short sock_addr_get_port (const sock_addr *addr);
int sock_addr_inet_pton(sock_addr *addr, const char *str, int family, unsigned short port);
const char * sock_addr_inet_ntop(const sock_addr *addr, char *buf, socklen_t sz);