Skip to content

Commit 8396089

Browse files
committed
allow fastrouter subscriptions to use hostnames
1 parent d15c291 commit 8396089

File tree

1 file changed

+55
-21
lines changed

1 file changed

+55
-21
lines changed

core/subscription.c

Lines changed: 55 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -602,7 +602,12 @@ static void send_subscription(int sfd, char *host, char *message, uint16_t messa
602602
memset(&udp_addr, 0, sizeof(struct sockaddr_in));
603603
udp_addr.sin_family = AF_INET;
604604
udp_addr.sin_port = htons(atoi(udp_port + 1));
605-
udp_addr.sin_addr.s_addr = inet_addr(host);
605+
char *resolved = uwsgi_resolve_ip(host);
606+
if (!resolved) {
607+
uwsgi_error("send_subscription()/socket()");
608+
return;
609+
}
610+
udp_addr.sin_addr.s_addr = inet_addr(resolved);
606611
ret = sendto(fd, message, message_size, 0, (struct sockaddr *) &udp_addr, sizeof(udp_addr));
607612
udp_port[0] = ':';
608613
}
@@ -652,15 +657,15 @@ static int uwsgi_subscription_ub_fix(struct uwsgi_buffer *ub, uint8_t modifier1,
652657
return 0;
653658
}
654659

655-
static struct uwsgi_buffer *uwsgi_subscription_ub(char *key, size_t keysize, uint8_t modifier1, uint8_t modifier2, uint8_t cmd, char *socket_name, char *sign, char *sni_key, char *sni_crt, char *sni_ca) {
660+
static struct uwsgi_buffer *uwsgi_subscription_ub(char *key, size_t keysize, uint8_t modifier1, uint8_t modifier2, uint8_t cmd, char *address, char *sign, char *sni_key, char *sni_crt, char *sni_ca) {
656661
struct uwsgi_buffer *ub = uwsgi_buffer_new(4096);
657662

658663
// make space for uwsgi header
659664
ub->pos = 4;
660665

661666
if (uwsgi_buffer_append_keyval(ub, "key", 3, key, keysize))
662667
goto end;
663-
if (uwsgi_buffer_append_keyval(ub, "address", 7, socket_name, strlen(socket_name)))
668+
if (uwsgi_buffer_append_keyval(ub, "address", 7, address, strlen(address)))
664669
goto end;
665670

666671
if (uwsgi.subscribe_with_modifier1) {
@@ -716,16 +721,16 @@ static struct uwsgi_buffer *uwsgi_subscription_ub(char *key, size_t keysize, uin
716721
return NULL;
717722
}
718723

719-
void uwsgi_send_subscription_from_fd(int fd, char *udp_address, char *key, size_t keysize, uint8_t modifier1, uint8_t modifier2, uint8_t cmd, char *socket_name, char *sign, char *sni_key, char *sni_crt, char *sni_ca) {
724+
void uwsgi_send_subscription_from_fd(int fd, char *udp_address, char *key, size_t keysize, uint8_t modifier1, uint8_t modifier2, uint8_t cmd, char *address, char *sign, char *sni_key, char *sni_crt, char *sni_ca) {
720725

721-
if (socket_name == NULL && !uwsgi.sockets)
726+
if (address == NULL && !uwsgi.sockets)
722727
return;
723728

724-
if (!socket_name) {
725-
socket_name = uwsgi.sockets->name;
729+
if (!address) {
730+
address = uwsgi.sockets->name;
726731
}
727732

728-
struct uwsgi_buffer *ub = uwsgi_subscription_ub(key, keysize, modifier1, modifier2, cmd, socket_name, sign, sni_key, sni_crt, sni_ca);
733+
struct uwsgi_buffer *ub = uwsgi_subscription_ub(key, keysize, modifier1, modifier2, cmd, address, sign, sni_key, sni_crt, sni_ca);
729734

730735
if (!ub)
731736
return;
@@ -735,8 +740,8 @@ void uwsgi_send_subscription_from_fd(int fd, char *udp_address, char *key, size_
735740
}
736741

737742

738-
void uwsgi_send_subscription(char *udp_address, char *key, size_t keysize, uint8_t modifier1, uint8_t modifier2, uint8_t cmd, char *socket_name, char *sign, char *sni_key, char *sni_crt, char *sni_ca) {
739-
uwsgi_send_subscription_from_fd(-1, udp_address, key, keysize, modifier1, modifier2, cmd, socket_name, sign, sni_key, sni_crt, sni_ca);
743+
void uwsgi_send_subscription(char *udp_address, char *key, size_t keysize, uint8_t modifier1, uint8_t modifier2, uint8_t cmd, char *address, char *sign, char *sni_key, char *sni_crt, char *sni_ca) {
744+
uwsgi_send_subscription_from_fd(-1, udp_address, key, keysize, modifier1, modifier2, cmd, address, sign, sni_key, sni_crt, sni_ca);
740745
}
741746

742747
#ifdef UWSGI_SSL
@@ -837,27 +842,43 @@ void uwsgi_subscribe(char *subscription, uint8_t cmd) {
837842
int keysize = 0;
838843
char *modifier1 = NULL;
839844
int modifier1_len = 0;
840-
char *socket_name = NULL;
845+
char *address = NULL;
846+
char *address_resolved = NULL;
841847
char *udp_address = subscription;
842848
char *udp_port = NULL;
843849
char *subscription_key = NULL;
844850
char *sign = NULL;
845851

846-
// check for explicit socket_name
852+
// Check for an explicit address. This may be a reference to a shared
853+
// socket i.e. "=0=REST", a unix socket "/path/to/socket.sock=REST",
854+
// or a udp socket "server-address:port=REST"
847855
char *equal = strchr(subscription, '=');
848856
if (equal) {
849-
socket_name = subscription;
850-
if (socket_name[0] == '=') {
851-
equal = strchr(socket_name + 1, '=');
857+
address = subscription;
858+
if (address[0] == '=') {
859+
equal = strchr(address + 1, '=');
852860
if (!equal)
853861
return;
854862
*equal = '\0';
855-
struct uwsgi_socket *us = uwsgi_get_shared_socket_by_num(atoi(socket_name + 1));
863+
struct uwsgi_socket *us = uwsgi_get_shared_socket_by_num(atoi(address + 1));
856864
if (!us)
857865
return;
858-
socket_name = us->name;
866+
address = us->name;
859867
}
860868
*equal = '\0';
869+
870+
char *address_port = strchr(address, ':');
871+
if (address_port) {
872+
*address_port = '\0';
873+
char *resolved = uwsgi_resolve_ip(address);
874+
*address_port = ':';
875+
876+
if (!resolved)
877+
return;
878+
879+
address_resolved = uwsgi_concat2n(resolved, strlen(resolved), address_port, equal - address_port);
880+
}
881+
861882
udp_address = equal + 1;
862883
}
863884

@@ -900,7 +921,7 @@ void uwsgi_subscribe(char *subscription, uint8_t cmd) {
900921
modifier1_len = strlen(modifier1);
901922
keysize = strlen(key);
902923
}
903-
uwsgi_send_subscription(udp_address, key, keysize, uwsgi_str_num(modifier1, modifier1_len), 0, cmd, socket_name, sign, NULL, NULL, NULL);
924+
uwsgi_send_subscription(udp_address, key, keysize, uwsgi_str_num(modifier1, modifier1_len), 0, cmd, address_resolved ? address_resolved : address, sign, NULL, NULL, NULL);
904925
modifier1 = NULL;
905926
modifier1_len = 0;
906927
}
@@ -918,7 +939,7 @@ void uwsgi_subscribe(char *subscription, uint8_t cmd) {
918939
modifier1_len = strlen(modifier1);
919940
keysize = strlen(key);
920941
}
921-
uwsgi_send_subscription(udp_address, key, keysize, uwsgi_str_num(modifier1, modifier1_len), 0, cmd, socket_name, sign, NULL, NULL, NULL);
942+
uwsgi_send_subscription(udp_address, key, keysize, uwsgi_str_num(modifier1, modifier1_len), 0, cmd, address_resolved ? address_resolved : address, sign, NULL, NULL, NULL);
922943
modifier1 = NULL;
923944
modifier1_len = 0;
924945
lines[i] = '\n';
@@ -947,7 +968,7 @@ void uwsgi_subscribe(char *subscription, uint8_t cmd) {
947968
modifier1_len = strlen(modifier1);
948969
}
949970

950-
uwsgi_send_subscription(udp_address, subscription_key + 1, strlen(subscription_key + 1), uwsgi_str_num(modifier1, modifier1_len), 0, cmd, socket_name, sign, NULL, NULL, NULL);
971+
uwsgi_send_subscription(udp_address, subscription_key + 1, strlen(subscription_key + 1), uwsgi_str_num(modifier1, modifier1_len), 0, cmd, address_resolved ? address_resolved : address, sign, NULL, NULL, NULL);
951972
if (modifier1)
952973
modifier1[-1] = ',';
953974
if (sign)
@@ -958,6 +979,7 @@ void uwsgi_subscribe(char *subscription, uint8_t cmd) {
958979
if (equal)
959980
*equal = '=';
960981
free(udp_address);
982+
free(address_resolved);
961983

962984
}
963985

@@ -967,6 +989,7 @@ void uwsgi_subscribe2(char *arg, uint8_t cmd) {
967989
char *s2_key = NULL;
968990
char *s2_socket = NULL;
969991
char *s2_addr = NULL;
992+
char *s2_addr_resolved = NULL;
970993
char *s2_weight = NULL;
971994
char *s2_sign = NULL;
972995
char *s2_modifier1 = NULL;
@@ -1051,14 +1074,23 @@ void uwsgi_subscribe2(char *arg, uint8_t cmd) {
10511074
s2_addr = uwsgi_str(uwsgi.sockets->name);
10521075
}
10531076

1077+
char *port = strchr(s2_addr, ':');
1078+
if (port) {
1079+
*port = '\0';
1080+
char *resolved = uwsgi_resolve_ip(s2_addr);
1081+
if (!resolved) goto end;
1082+
*port = ':';
1083+
s2_addr_resolved = uwsgi_concat2n(resolved, strlen(resolved), port, strlen(port));
1084+
}
1085+
10541086
ub = uwsgi_buffer_new(uwsgi.page_size);
10551087
if (!ub) goto end;
10561088
// leave space for the header
10571089
ub->pos = 4;
10581090

10591091
if (uwsgi_buffer_append_keyval(ub, "key", 3, s2_key, strlen(s2_key)))
10601092
goto end;
1061-
if (uwsgi_buffer_append_keyval(ub, "address", 7, s2_addr, strlen(s2_addr)))
1093+
if (uwsgi_buffer_append_keyval(ub, "address", 7, s2_addr_resolved ? s2_addr_resolved : s2_addr, strlen(s2_addr_resolved ? s2_addr_resolved : s2_addr)))
10621094
goto end;
10631095
if (uwsgi_buffer_append_keynum(ub, "modifier1", 9, modifier1))
10641096
goto end;
@@ -1140,6 +1172,8 @@ void uwsgi_subscribe2(char *arg, uint8_t cmd) {
11401172
free(s2_socket);
11411173
if (s2_addr)
11421174
free(s2_addr);
1175+
if (s2_addr_resolved)
1176+
free(s2_addr_resolved);
11431177
if (s2_weight)
11441178
free(s2_weight);
11451179
if (s2_modifier1)

0 commit comments

Comments
 (0)