|
4 | 4 | #include "herr.h" |
5 | 5 | #include "hlog.h" |
6 | 6 | #include "htime.h" |
| 7 | +#include "hsocket.h" |
7 | 8 |
|
8 | 9 | #include "EventLoop.h" |
9 | 10 | using namespace hv; |
@@ -178,15 +179,31 @@ static void WINAPI loop_thread_stdcall(void* userdata) { |
178 | 179 | */ |
179 | 180 | int http_server_run(http_server_t* server, int wait) { |
180 | 181 | // http_port |
181 | | - if (server->port > 0) { |
| 182 | + if (server->port >= 0) { |
182 | 183 | server->listenfd[0] = Listen(server->port, server->host); |
183 | 184 | if (server->listenfd[0] < 0) return server->listenfd[0]; |
| 185 | + if (server->port == 0) { |
| 186 | + // port=0: OS auto-assigned a free port, retrieve the actual port |
| 187 | + sockaddr_u localaddr; |
| 188 | + socklen_t addrlen = sizeof(localaddr); |
| 189 | + if (getsockname(server->listenfd[0], &localaddr.sa, &addrlen) == 0) { |
| 190 | + server->port = sockaddr_port(&localaddr); |
| 191 | + } |
| 192 | + } |
184 | 193 | hlogi("http server listening on %s:%d", server->host, server->port); |
185 | 194 | } |
186 | 195 | // https_port |
187 | | - if (server->https_port > 0 && HV_WITH_SSL) { |
| 196 | + if (server->https_port >= 0 && HV_WITH_SSL) { |
188 | 197 | server->listenfd[1] = Listen(server->https_port, server->host); |
189 | 198 | if (server->listenfd[1] < 0) return server->listenfd[1]; |
| 199 | + if (server->https_port == 0) { |
| 200 | + // https_port=0: OS auto-assigned a free port, retrieve the actual port |
| 201 | + sockaddr_u localaddr; |
| 202 | + socklen_t addrlen = sizeof(localaddr); |
| 203 | + if (getsockname(server->listenfd[1], &localaddr.sa, &addrlen) == 0) { |
| 204 | + server->https_port = sockaddr_port(&localaddr); |
| 205 | + } |
| 206 | + } |
190 | 207 | hlogi("https server listening on %s:%d", server->host, server->https_port); |
191 | 208 | } |
192 | 209 | // SSL_CTX |
|
0 commit comments