@@ -245,38 +245,75 @@ static void add_header_to_strbuf(const char *header,
245
245
return add_param_len (strbuf , header , header_len , value , value_len );
246
246
}
247
247
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
+
248
305
static enum lwan_http_status add_params (const struct private_data * pd ,
249
306
struct lwan_request * request ,
250
307
struct lwan_response * response )
251
308
{
252
309
const struct lwan_request_parser_helper * request_helper = request -> helper ;
253
310
struct lwan_strbuf * strbuf = response -> buffer ;
254
311
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
-
261
312
/* Very compliant. Much CGI. Wow. */
262
313
add_param (strbuf , "GATEWAY_INTERFACE" , "CGI/1.1" );
263
314
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 ;
280
317
281
318
add_param (strbuf , "SERVER_SOFTWARE" , "Lwan" );
282
319
add_param (strbuf , "SERVER_PROTOCOL" ,
0 commit comments