VLOG(5) << "AsyncSocket::performRead() this=" << this
<< ", buf=" << *buf << ", buflen=" << *buflen;
- ssize_t bytes = recv(fd_, *buf, *buflen, MSG_DONTWAIT);
+ int recvFlags = 0;
+ if (peek_) {
+ recvFlags |= MSG_PEEK;
+ }
+
+ ssize_t bytes = recv(fd_, *buf, *buflen, MSG_DONTWAIT | recvFlags);
if (bytes < 0) {
if (errno == EAGAIN || errno == EWOULDBLOCK) {
// No more data to read right now.
return setsockopt(fd_, level, optname, optval, sizeof(T));
}
+ virtual void setPeek(bool peek) {
+ peek_ = peek;
+ }
+
enum class StateEnum : uint8_t {
UNINIT,
CONNECTING,
size_t appBytesReceived_; ///< Num of bytes received from socket
size_t appBytesWritten_; ///< Num of bytes written to socket
bool isBufferMovable_{false};
+
+ bool peek_{false}; // Peek bytes.
};
public:
MockAsyncSSLSocket(
const std::shared_ptr<SSLContext>& ctx,
- EventBase* base) :
- AsyncSSLSocket(ctx, base) {
+ EventBase* base,
+ bool deferSecurityNegotiation = false) :
+ AsyncSSLSocket(ctx, base, deferSecurityNegotiation) {
}
GMOCK_METHOD5_(, noexcept, ,
MOCK_CONST_METHOD2(
getSelectedNextProtocolNoThrow,
bool(const unsigned char**, unsigned*));
+ MOCK_METHOD1(setPeek, void(bool));
+ MOCK_METHOD1(setReadCB, void(ReadCallback*));
void sslConn(
AsyncSSLSocket::HandshakeCB* cb,
sslConnectMockable(cb, timeout, verify);
}
+
+ void sslAccept(
+ AsyncSSLSocket::HandshakeCB* cb,
+ uint32_t timeout,
+ const SSLContext::SSLVerifyPeerEnum& verify)
+ override {
+ if (timeout > 0) {
+ handshakeTimeout_.scheduleTimeout(timeout);
+ }
+
+ state_ = StateEnum::ESTABLISHED;
+ sslState_ = STATE_ACCEPTING;
+ handshakeCallback_ = cb;
+
+ sslAcceptMockable(cb, timeout, verify);
+ }
+
MOCK_METHOD3(
sslConnectMockable,
void(AsyncSSLSocket::HandshakeCB*, uint64_t,
const SSLContext::SSLVerifyPeerEnum&));
+
+ MOCK_METHOD3(
+ sslAcceptMockable,
+ void(AsyncSSLSocket::HandshakeCB*, uint32_t,
+ const SSLContext::SSLVerifyPeerEnum&));
};
}}