Fixed build problem with OPENSSL_SUPPORT

This commit is contained in:
yhirose 2018-03-13 22:44:28 -04:00
parent 73fa115803
commit b6790b39c1

View File

@ -171,26 +171,7 @@ public:
virtual int read(char* ptr, size_t size); virtual int read(char* ptr, size_t size);
virtual int write(const char* ptr, size_t size); virtual int write(const char* ptr, size_t size);
virtual int write(const char* ptr); virtual int write(const char* ptr);
virtual std::string get_remote_addr();
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;
}
private: private:
socket_t sock_; socket_t sock_;
@ -293,14 +274,16 @@ private:
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT #ifdef CPPHTTPLIB_OPENSSL_SUPPORT
class SSLSocketStream : public Stream { class SSLSocketStream : public Stream {
public: public:
SSLSocketStream(SSL* ssl); SSLSocketStream(socket_t sock, SSL* ssl);
virtual ~SSLSocketStream(); virtual ~SSLSocketStream();
virtual int read(char* ptr, size_t size); virtual int read(char* ptr, size_t size);
virtual int write(const char* ptr, size_t size); virtual int write(const char* ptr, size_t size);
virtual int write(const char* ptr); virtual int write(const char* ptr);
virtual std::string get_remote_addr();
private: private:
socket_t sock_;
SSL* ssl_; SSL* ssl_;
}; };
@ -583,6 +566,24 @@ inline bool is_connection_error()
#endif #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) inline bool is_file(const std::string& path)
{ {
struct stat st; struct stat st;
@ -1341,6 +1342,10 @@ inline int SocketStream::write(const char* ptr)
return write(ptr, strlen(ptr)); return write(ptr, strlen(ptr));
} }
inline std::string SocketStream::get_remote_addr() {
return detail::get_remote_addr(sock_);
}
// HTTP server implementation // HTTP server implementation
inline Server::Server(HttpVersion http_version) inline Server::Server(HttpVersion http_version)
: http_version_(http_version) : http_version_(http_version)
@ -1918,7 +1923,7 @@ inline bool read_and_close_socket_ssl(
CPPHTTPLIB_KEEPALIVE_TIMEOUT_SECOND, CPPHTTPLIB_KEEPALIVE_TIMEOUT_SECOND,
CPPHTTPLIB_KEEPALIVE_TIMEOUT_USECOND) > 0) { CPPHTTPLIB_KEEPALIVE_TIMEOUT_USECOND) > 0) {
auto last_connection = count == 1; auto last_connection = count == 1;
SSLSocketStream strm(ssl); SSLSocketStream strm(sock, ssl);
ret = callback(strm, last_connection); ret = callback(strm, last_connection);
if (!ret) { if (!ret) {
break; break;
@ -1926,7 +1931,7 @@ inline bool read_and_close_socket_ssl(
count--; count--;
} }
} else { } else {
SSLSocketStream strm(ssl); SSLSocketStream strm(sock, ssl);
ret = callback(strm, true); ret = callback(strm, true);
} }
@ -1949,7 +1954,8 @@ static SSLInit sslinit_;
} // namespace detail } // namespace detail
// SSL socket stream implementation // 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)); return write(ptr, strlen(ptr));
} }
inline std::string SSLSocketStream::get_remote_addr() {
return detail::get_remote_addr(sock_);
}
// SSL HTTP server implementation // SSL HTTP server implementation
inline SSLServer::SSLServer(const char* cert_path, const char* private_key_path, HttpVersion http_version) inline SSLServer::SSLServer(const char* cert_path, const char* private_key_path, HttpVersion http_version)
: Server(http_version) : Server(http_version)