Browse Source

Fixed build problem with OPENSSL_SUPPORT

yhirose 7 years ago
parent
commit
b6790b39c1
1 changed files with 34 additions and 24 deletions
  1. 34 24
      httplib.h

+ 34 - 24
httplib.h

@@ -171,26 +171,7 @@ public:
     virtual int read(char* ptr, size_t size);
     virtual int write(const char* ptr, size_t size);
     virtual int write(const char* ptr);
-    
-    std::string get_remote_addr() {
-        socklen_t len;
-        struct sockaddr_storage addr;
-        char ipstr[INET6_ADDRSTRLEN];
-
-        len = sizeof addr;
-        getpeername(sock_, (struct sockaddr*)&addr, &len);
-
-        // deal with both IPv4 and IPv6:
-        if (addr.ss_family == AF_INET) {
-            struct sockaddr_in *s = (struct sockaddr_in *)&addr;
-            inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
-        } else { // AF_INET6
-            struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;
-            inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr);
-        }
-
-        return ipstr;
-    }
+    virtual std::string get_remote_addr();
 
 private:
     socket_t sock_;
@@ -293,14 +274,16 @@ private:
 #ifdef CPPHTTPLIB_OPENSSL_SUPPORT
 class SSLSocketStream : public Stream {
 public:
-    SSLSocketStream(SSL* ssl);
+    SSLSocketStream(socket_t sock, SSL* ssl);
     virtual ~SSLSocketStream();
 
     virtual int read(char* ptr, size_t size);
     virtual int write(const char* ptr, size_t size);
     virtual int write(const char* ptr);
+    virtual std::string get_remote_addr();
 
 private:
+    socket_t sock_;
     SSL* ssl_;
 };
 
@@ -583,6 +566,24 @@ inline bool is_connection_error()
 #endif
 }
 
+inline std::string get_remote_addr(socket_t sock) {
+    struct sockaddr_storage addr;
+    char ipstr[INET6_ADDRSTRLEN];
+    socklen_t len = sizeof(addr);
+    getpeername(sock, (struct sockaddr*)&addr, &len);
+
+    // deal with both IPv4 and IPv6:
+    if (addr.ss_family == AF_INET) {
+        auto s = (struct sockaddr_in *)&addr;
+        inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof(ipstr));
+    } else { // AF_INET6
+        auto s = (struct sockaddr_in6 *)&addr;
+        inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof(ipstr));
+    }
+
+    return ipstr;
+}
+
 inline bool is_file(const std::string& path)
 {
     struct stat st;
@@ -1341,6 +1342,10 @@ inline int SocketStream::write(const char* ptr)
     return write(ptr, strlen(ptr));
 }
 
+inline std::string SocketStream::get_remote_addr() {
+    return detail::get_remote_addr(sock_);
+}
+
 // HTTP server implementation
 inline Server::Server(HttpVersion http_version)
     : http_version_(http_version)
@@ -1918,7 +1923,7 @@ inline bool read_and_close_socket_ssl(
                    CPPHTTPLIB_KEEPALIVE_TIMEOUT_SECOND,
                    CPPHTTPLIB_KEEPALIVE_TIMEOUT_USECOND) > 0) {
             auto last_connection = count == 1;
-            SSLSocketStream strm(ssl);
+            SSLSocketStream strm(sock, ssl);
             ret = callback(strm, last_connection);
             if (!ret) {
                 break;
@@ -1926,7 +1931,7 @@ inline bool read_and_close_socket_ssl(
             count--;
         }
     } else {
-        SSLSocketStream strm(ssl);
+        SSLSocketStream strm(sock, ssl);
         ret = callback(strm, true);
     }
 
@@ -1949,7 +1954,8 @@ static SSLInit sslinit_;
 } // namespace detail
 
 // SSL socket stream implementation
-inline SSLSocketStream::SSLSocketStream(SSL* ssl): ssl_(ssl)
+inline SSLSocketStream::SSLSocketStream(socket_t sock, SSL* ssl)
+    : sock_(sock), ssl_(ssl)
 {
 }
 
@@ -1972,6 +1978,10 @@ inline int SSLSocketStream::write(const char* ptr)
     return write(ptr, strlen(ptr));
 }
 
+inline std::string SSLSocketStream::get_remote_addr() {
+    return detail::get_remote_addr(sock_);
+}
+
 // SSL HTTP server implementation
 inline SSLServer::SSLServer(const char* cert_path, const char* private_key_path, HttpVersion http_version)
     : Server(http_version)