@@ -413,6 +413,8 @@ struct Request {
413
413
414
414
std::string remote_addr;
415
415
int remote_port = -1 ;
416
+ std::string local_addr;
417
+ int local_port = -1 ;
416
418
417
419
// for server
418
420
std::string version;
@@ -514,6 +516,7 @@ class Stream {
514
516
virtual ssize_t read (char *ptr, size_t size) = 0;
515
517
virtual ssize_t write (const char *ptr, size_t size) = 0;
516
518
virtual void get_remote_ip_and_port (std::string &ip, int &port) const = 0;
519
+ virtual void get_local_ip_and_port (std::string &ip, int &port) const = 0;
517
520
virtual socket_t socket () const = 0;
518
521
519
522
template <typename ... Args>
@@ -1778,6 +1781,7 @@ class BufferStream : public Stream {
1778
1781
ssize_t read (char *ptr, size_t size) override ;
1779
1782
ssize_t write (const char *ptr, size_t size) override ;
1780
1783
void get_remote_ip_and_port (std::string &ip, int &port) const override ;
1784
+ void get_local_ip_and_port (std::string &ip, int &port) const override ;
1781
1785
socket_t socket () const override ;
1782
1786
1783
1787
const std::string &get_buffer () const ;
@@ -2446,6 +2450,7 @@ class SocketStream : public Stream {
2446
2450
ssize_t read (char *ptr, size_t size) override ;
2447
2451
ssize_t write (const char *ptr, size_t size) override ;
2448
2452
void get_remote_ip_and_port (std::string &ip, int &port) const override ;
2453
+ void get_local_ip_and_port (std::string &ip, int &port) const override ;
2449
2454
socket_t socket () const override ;
2450
2455
2451
2456
private:
@@ -2475,6 +2480,7 @@ class SSLSocketStream : public Stream {
2475
2480
ssize_t read (char *ptr, size_t size) override ;
2476
2481
ssize_t write (const char *ptr, size_t size) override ;
2477
2482
void get_remote_ip_and_port (std::string &ip, int &port) const override ;
2483
+ void get_local_ip_and_port (std::string &ip, int &port) const override ;
2478
2484
socket_t socket () const override ;
2479
2485
2480
2486
private:
@@ -2843,9 +2849,9 @@ inline socket_t create_client_socket(
2843
2849
return sock;
2844
2850
}
2845
2851
2846
- inline bool get_remote_ip_and_port (const struct sockaddr_storage &addr,
2847
- socklen_t addr_len, std::string &ip,
2848
- int &port) {
2852
+ inline bool get_ip_and_port (const struct sockaddr_storage &addr,
2853
+ socklen_t addr_len, std::string &ip,
2854
+ int &port) {
2849
2855
if (addr.ss_family == AF_INET) {
2850
2856
port = ntohs (reinterpret_cast <const struct sockaddr_in *>(&addr)->sin_port );
2851
2857
} else if (addr.ss_family == AF_INET6) {
@@ -2866,6 +2872,15 @@ inline bool get_remote_ip_and_port(const struct sockaddr_storage &addr,
2866
2872
return true ;
2867
2873
}
2868
2874
2875
+ inline void get_local_ip_and_port (socket_t sock, std::string &ip, int &port) {
2876
+ struct sockaddr_storage addr;
2877
+ socklen_t addr_len = sizeof (addr);
2878
+ if (!getsockname (sock, reinterpret_cast <struct sockaddr *>(&addr),
2879
+ &addr_len)) {
2880
+ get_ip_and_port (addr, addr_len, ip, port);
2881
+ }
2882
+ }
2883
+
2869
2884
inline void get_remote_ip_and_port (socket_t sock, std::string &ip, int &port) {
2870
2885
struct sockaddr_storage addr;
2871
2886
socklen_t addr_len = sizeof (addr);
@@ -2890,7 +2905,7 @@ inline void get_remote_ip_and_port(socket_t sock, std::string &ip, int &port) {
2890
2905
return ;
2891
2906
}
2892
2907
#endif
2893
- get_remote_ip_and_port (addr, addr_len, ip, port);
2908
+ get_ip_and_port (addr, addr_len, ip, port);
2894
2909
}
2895
2910
}
2896
2911
@@ -4517,8 +4532,8 @@ inline void hosted_at(const std::string &hostname,
4517
4532
*reinterpret_cast <struct sockaddr_storage *>(rp->ai_addr );
4518
4533
std::string ip;
4519
4534
int dummy = -1 ;
4520
- if (detail::get_remote_ip_and_port (addr, sizeof (struct sockaddr_storage ),
4521
- ip, dummy)) {
4535
+ if (detail::get_ip_and_port (addr, sizeof (struct sockaddr_storage ),
4536
+ ip, dummy)) {
4522
4537
addrs.push_back (ip);
4523
4538
}
4524
4539
}
@@ -4808,6 +4823,11 @@ inline void SocketStream::get_remote_ip_and_port(std::string &ip,
4808
4823
return detail::get_remote_ip_and_port (sock_, ip, port);
4809
4824
}
4810
4825
4826
+ inline void SocketStream::get_local_ip_and_port (std::string &ip,
4827
+ int &port) const {
4828
+ return detail::get_local_ip_and_port (sock_, ip, port);
4829
+ }
4830
+
4811
4831
inline socket_t SocketStream::socket () const { return sock_; }
4812
4832
4813
4833
// Buffer stream implementation
@@ -4833,6 +4853,9 @@ inline ssize_t BufferStream::write(const char *ptr, size_t size) {
4833
4853
inline void BufferStream::get_remote_ip_and_port (std::string & /* ip*/ ,
4834
4854
int & /* port*/ ) const {}
4835
4855
4856
+ inline void BufferStream::get_local_ip_and_port (std::string & /* ip*/ ,
4857
+ int & /* port*/ ) const {}
4858
+
4836
4859
inline socket_t BufferStream::socket () const { return 0 ; }
4837
4860
4838
4861
inline const std::string &BufferStream::get_buffer () const { return buffer; }
@@ -5812,6 +5835,10 @@ Server::process_request(Stream &strm, bool close_connection,
5812
5835
req.set_header (" REMOTE_ADDR" , req.remote_addr );
5813
5836
req.set_header (" REMOTE_PORT" , std::to_string (req.remote_port ));
5814
5837
5838
+ strm.get_local_ip_and_port (req.local_addr , req.local_port );
5839
+ req.set_header (" LOCAL_ADDR" , req.local_addr );
5840
+ req.set_header (" LOCAL_PORT" , std::to_string (req.local_port ));
5841
+
5815
5842
if (req.has_header (" Range" )) {
5816
5843
const auto &range_header_value = req.get_header_value (" Range" );
5817
5844
if (!detail::parse_range_header (range_header_value, req.ranges )) {
@@ -7409,6 +7436,11 @@ inline void SSLSocketStream::get_remote_ip_and_port(std::string &ip,
7409
7436
detail::get_remote_ip_and_port (sock_, ip, port);
7410
7437
}
7411
7438
7439
+ inline void SSLSocketStream::get_local_ip_and_port (std::string &ip,
7440
+ int &port) const {
7441
+ detail::get_local_ip_and_port (sock_, ip, port);
7442
+ }
7443
+
7412
7444
inline socket_t SSLSocketStream::socket () const { return sock_; }
7413
7445
7414
7446
static SSLInit sslinit_;
0 commit comments