Skip to content

Commit 7c89006

Browse files
committed
Implement SERVER_ADDR and SERVER_PORT in mod-fastcgi
1 parent 44ed5ea commit 7c89006

File tree

1 file changed

+59
-22
lines changed

1 file changed

+59
-22
lines changed

src/lib/lwan-mod-fastcgi.c

+59-22
Original file line numberDiff line numberDiff line change
@@ -245,38 +245,75 @@ static void add_header_to_strbuf(const char *header,
245245
return add_param_len(strbuf, header, header_len, value, value_len);
246246
}
247247

248+
static bool fill_addr_and_port(const struct lwan_request *r,
249+
struct lwan_strbuf *strbuf)
250+
{
251+
const struct lwan_thread *t = r->conn->thread;
252+
char local_addr_buf[INET6_ADDRSTRLEN], remote_addr_buf[INET6_ADDRSTRLEN];
253+
struct sockaddr_storage sockaddr = {.ss_family = AF_UNSPEC};
254+
uint16_t local_port, remote_port;
255+
socklen_t len = sizeof(sockaddr);
256+
const char *local_addr, *remote_addr;
257+
258+
if (r->conn->flags & CONN_TLS) {
259+
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&sockaddr;
260+
261+
if (getsockname(t->tls_listen_fd, (struct sockaddr *)&sockaddr, &len) <
262+
0)
263+
return false;
264+
265+
assert(len == sizeof(*sin6));
266+
267+
local_addr = inet_ntop(AF_INET6, &sin6->sin6_addr, local_addr_buf,
268+
sizeof(local_addr_buf));
269+
local_port = ntohs(sin6->sin6_port);
270+
271+
add_param(strbuf, "HTTPS", "on");
272+
} else {
273+
struct sockaddr_in *sin = (struct sockaddr_in *)&sockaddr;
274+
275+
if (getsockname(t->listen_fd, (struct sockaddr *)&sockaddr, &len) < 0)
276+
return false;
277+
278+
assert(len == sizeof(*sin));
279+
280+
local_addr = inet_ntop(AF_INET, &sin->sin_addr, local_addr_buf,
281+
sizeof(local_addr_buf));
282+
local_port = ntohs(sin->sin_port);
283+
284+
add_param(strbuf, "HTTPS", "");
285+
}
286+
287+
remote_addr = lwan_request_get_remote_address_and_port(r, remote_addr_buf,
288+
&remote_port);
289+
290+
if (!local_addr)
291+
return false;
292+
293+
if (!remote_addr)
294+
return false;
295+
296+
add_param(strbuf, "SERVER_ADDR", local_addr);
297+
add_int_param(strbuf, "SERVER_PORT", local_port);
298+
299+
add_param(strbuf, "REMOTE_ADDR", remote_addr);
300+
add_int_param(strbuf, "REMOTE_PORT", remote_port);
301+
302+
return true;
303+
}
304+
248305
static enum lwan_http_status add_params(const struct private_data *pd,
249306
struct lwan_request *request,
250307
struct lwan_response *response)
251308
{
252309
const struct lwan_request_parser_helper *request_helper = request->helper;
253310
struct lwan_strbuf *strbuf = response->buffer;
254311

255-
char remote_addr[INET6_ADDRSTRLEN];
256-
uint16_t remote_port;
257-
258-
/* FIXME: let's use some hardcoded values for now so that we can
259-
* verify that the implementation is working first */
260-
261312
/* Very compliant. Much CGI. Wow. */
262313
add_param(strbuf, "GATEWAY_INTERFACE", "CGI/1.1");
263314

264-
add_param(strbuf, "REMOTE_ADDR",
265-
lwan_request_get_remote_address_and_port(request, remote_addr,
266-
&remote_port));
267-
add_int_param(strbuf, "REMOTE_PORT", remote_port);
268-
269-
add_param(strbuf, "SERVER_ADDR", "127.0.0.1");
270-
271-
/* FIXME: get the actual port from thread->listen_fd or
272-
* thread->tls_listen_fd */
273-
if (request->conn->flags & CONN_TLS) {
274-
add_param(strbuf, "SERVER_PORT", "0");
275-
add_param(strbuf, "HTTPS", "on");
276-
} else {
277-
add_param(strbuf, "SERVER_PORT", "0");
278-
add_param(strbuf, "HTTPS", "");
279-
}
315+
if (!fill_addr_and_port(request, strbuf))
316+
return HTTP_INTERNAL_ERROR;
280317

281318
add_param(strbuf, "SERVER_SOFTWARE", "Lwan");
282319
add_param(strbuf, "SERVER_PROTOCOL",

0 commit comments

Comments
 (0)