Skip to content

Commit 89f6dcc

Browse files
committed
allow fastrouter subscriptions to use hostnames
1 parent 02a2fc4 commit 89f6dcc

File tree

1 file changed

+57
-21
lines changed

1 file changed

+57
-21
lines changed

core/subscription.c

Lines changed: 57 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -643,7 +643,12 @@ static void send_subscription(int sfd, char *host, char *message, uint16_t messa
643643
memset(&udp_addr, 0, sizeof(struct sockaddr_in));
644644
udp_addr.sin_family = AF_INET;
645645
udp_addr.sin_port = htons(atoi(udp_port + 1));
646-
udp_addr.sin_addr.s_addr = inet_addr(host);
646+
char *resolved = uwsgi_resolve_ip(host);
647+
if (!resolved) {
648+
uwsgi_error("send_subscription()/socket()");
649+
return;
650+
}
651+
udp_addr.sin_addr.s_addr = inet_addr(resolved);
647652
ret = sendto(fd, message, message_size, 0, (struct sockaddr *) &udp_addr, sizeof(udp_addr));
648653
udp_port[0] = ':';
649654
}
@@ -669,15 +674,15 @@ static void send_subscription(int sfd, char *host, char *message, uint16_t messa
669674
close(fd);
670675
}
671676

672-
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) {
677+
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) {
673678
struct uwsgi_buffer *ub = uwsgi_buffer_new(4096);
674679

675680
// make space for uwsgi header
676681
ub->pos = 4;
677682

678683
if (uwsgi_buffer_append_keyval(ub, "key", 3, key, keysize))
679684
goto end;
680-
if (uwsgi_buffer_append_keyval(ub, "address", 7, socket_name, strlen(socket_name)))
685+
if (uwsgi_buffer_append_keyval(ub, "address", 7, address, strlen(address)))
681686
goto end;
682687

683688
if (uwsgi.subscribe_with_modifier1) {
@@ -752,16 +757,16 @@ static struct uwsgi_buffer *uwsgi_subscription_ub(char *key, size_t keysize, uin
752757
return NULL;
753758
}
754759

755-
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) {
760+
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) {
756761

757-
if (socket_name == NULL && !uwsgi.sockets)
762+
if (address == NULL && !uwsgi.sockets)
758763
return;
759764

760-
if (!socket_name) {
761-
socket_name = uwsgi.sockets->name;
765+
if (!address) {
766+
address = uwsgi.sockets->name;
762767
}
763768

764-
struct uwsgi_buffer *ub = uwsgi_subscription_ub(key, keysize, modifier1, modifier2, cmd, socket_name, sign, sni_key, sni_crt, sni_ca);
769+
struct uwsgi_buffer *ub = uwsgi_subscription_ub(key, keysize, modifier1, modifier2, cmd, address, sign, sni_key, sni_crt, sni_ca);
765770

766771
if (!ub)
767772
return;
@@ -771,8 +776,8 @@ void uwsgi_send_subscription_from_fd(int fd, char *udp_address, char *key, size_
771776
}
772777

773778

774-
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) {
775-
uwsgi_send_subscription_from_fd(-1, udp_address, key, keysize, modifier1, modifier2, cmd, socket_name, sign, sni_key, sni_crt, sni_ca);
779+
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) {
780+
uwsgi_send_subscription_from_fd(-1, udp_address, key, keysize, modifier1, modifier2, cmd, address, sign, sni_key, sni_crt, sni_ca);
776781
}
777782

778783
#ifdef UWSGI_SSL
@@ -880,27 +885,43 @@ void uwsgi_subscribe(char *subscription, uint8_t cmd) {
880885
int keysize = 0;
881886
char *modifier1 = NULL;
882887
int modifier1_len = 0;
883-
char *socket_name = NULL;
888+
char *address = NULL;
889+
char *address_resolved = NULL;
884890
char *udp_address = subscription;
885891
char *udp_port = NULL;
886892
char *subscription_key = NULL;
887893
char *sign = NULL;
888894

889-
// check for explicit socket_name
895+
// Check for an explicit address. This may be a reference to a shared
896+
// socket i.e. "=0=REST", a unix socket "/path/to/socket.sock=REST",
897+
// or a udp socket "server-address:port=REST"
890898
char *equal = strchr(subscription, '=');
891899
if (equal) {
892-
socket_name = subscription;
893-
if (socket_name[0] == '=') {
894-
equal = strchr(socket_name + 1, '=');
900+
address = subscription;
901+
if (address[0] == '=') {
902+
equal = strchr(address + 1, '=');
895903
if (!equal)
896904
return;
897905
*equal = '\0';
898-
struct uwsgi_socket *us = uwsgi_get_shared_socket_by_num(atoi(socket_name + 1));
906+
struct uwsgi_socket *us = uwsgi_get_shared_socket_by_num(atoi(address + 1));
899907
if (!us)
900908
return;
901-
socket_name = us->name;
909+
address = us->name;
902910
}
903911
*equal = '\0';
912+
913+
char *address_port = strchr(address, ':');
914+
if (address_port) {
915+
*address_port = '\0';
916+
char *resolved = uwsgi_resolve_ip(address);
917+
*address_port = ':';
918+
919+
if (!resolved)
920+
return;
921+
922+
address_resolved = uwsgi_concat2n(resolved, strlen(resolved), address_port, equal - address_port);
923+
}
924+
904925
udp_address = equal + 1;
905926
}
906927

@@ -943,7 +964,7 @@ void uwsgi_subscribe(char *subscription, uint8_t cmd) {
943964
modifier1_len = strlen(modifier1);
944965
keysize = strlen(key);
945966
}
946-
uwsgi_send_subscription(udp_address, key, keysize, uwsgi_str_num(modifier1, modifier1_len), 0, cmd, socket_name, sign, NULL, NULL, NULL);
967+
uwsgi_send_subscription(udp_address, key, keysize, uwsgi_str_num(modifier1, modifier1_len), 0, cmd, address_resolved ? address_resolved : address, sign, NULL, NULL, NULL);
947968
modifier1 = NULL;
948969
modifier1_len = 0;
949970
}
@@ -961,7 +982,7 @@ void uwsgi_subscribe(char *subscription, uint8_t cmd) {
961982
modifier1_len = strlen(modifier1);
962983
keysize = strlen(key);
963984
}
964-
uwsgi_send_subscription(udp_address, key, keysize, uwsgi_str_num(modifier1, modifier1_len), 0, cmd, socket_name, sign, NULL, NULL, NULL);
985+
uwsgi_send_subscription(udp_address, key, keysize, uwsgi_str_num(modifier1, modifier1_len), 0, cmd, address_resolved ? address_resolved : address, sign, NULL, NULL, NULL);
965986
modifier1 = NULL;
966987
modifier1_len = 0;
967988
lines[i] = '\n';
@@ -990,7 +1011,7 @@ void uwsgi_subscribe(char *subscription, uint8_t cmd) {
9901011
modifier1_len = strlen(modifier1);
9911012
}
9921013

993-
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);
1014+
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);
9941015
if (modifier1)
9951016
modifier1[-1] = ',';
9961017
if (sign)
@@ -1001,6 +1022,7 @@ void uwsgi_subscribe(char *subscription, uint8_t cmd) {
10011022
if (equal)
10021023
*equal = '=';
10031024
free(udp_address);
1025+
free(address_resolved);
10041026

10051027
}
10061028

@@ -1010,6 +1032,7 @@ void uwsgi_subscribe2(char *arg, uint8_t cmd) {
10101032
char *s2_key = NULL;
10111033
char *s2_socket = NULL;
10121034
char *s2_addr = NULL;
1035+
char *s2_addr_resolved = NULL;
10131036
char *s2_weight = NULL;
10141037
char *s2_sign = NULL;
10151038
char *s2_modifier1 = NULL;
@@ -1056,7 +1079,18 @@ void uwsgi_subscribe2(char *arg, uint8_t cmd) {
10561079
modifier2 = atoi(s2_modifier2);
10571080
}
10581081

1059-
uwsgi_send_subscription(s2_server, s2_key, strlen(s2_key), modifier1, modifier2, cmd, s2_addr, s2_sign, s2_sni_key, s2_sni_crt, s2_sni_ca);
1082+
if (s2_addr) {
1083+
char *port = strchr(s2_addr, ':');
1084+
if (port) {
1085+
*port = '\0';
1086+
char *resolved = uwsgi_resolve_ip(s2_addr);
1087+
if (!resolved) goto end;
1088+
*port = ':';
1089+
s2_addr_resolved = uwsgi_concat2n(resolved, strlen(resolved), port, strlen(port));
1090+
}
1091+
}
1092+
1093+
uwsgi_send_subscription(s2_server, s2_key, strlen(s2_key), modifier1, modifier2, cmd, s2_addr_resolved ? s2_addr_resolved : s2_addr, s2_sign, s2_sni_key, s2_sni_crt, s2_sni_ca);
10601094
end:
10611095
if (s2_server)
10621096
free(s2_server);
@@ -1066,6 +1100,8 @@ void uwsgi_subscribe2(char *arg, uint8_t cmd) {
10661100
free(s2_socket);
10671101
if (s2_addr)
10681102
free(s2_addr);
1103+
if (s2_addr_resolved)
1104+
free(s2_addr_resolved);
10691105
if (s2_weight)
10701106
free(s2_weight);
10711107
if (s2_modifier1)

0 commit comments

Comments
 (0)