MCPcopy Create free account
hub / github.com/apache/brpc / DoRead

Method DoRead

src/brpc/socket.cpp:2042–2122  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2040}
2041
2042ssize_t Socket::DoRead(size_t size_hint) {
2043 if (ssl_state() == SSL_UNKNOWN) {
2044 int error_code = 0;
2045 _ssl_state = DetectSSLState(fd(), &error_code);
2046 switch (ssl_state()) {
2047 case SSL_UNKNOWN:
2048 if (error_code == 0) { // EOF
2049 return 0;
2050 } else {
2051 errno = error_code;
2052 return -1;
2053 }
2054
2055 case SSL_CONNECTING:
2056 if (SSLHandshake(fd(), true) != 0) {
2057 errno = EINVAL;
2058 return -1;
2059 }
2060 break;
2061
2062 case SSL_CONNECTED:
2063 CHECK(false) << "Impossible to reach here";
2064 break;
2065
2066 case SSL_OFF:
2067 break;
2068 }
2069 }
2070 // _ssl_state has been set
2071 if (ssl_state() == SSL_OFF) {
2072 if (_force_ssl) {
2073 errno = ESSL;
2074 return -1;
2075 }
2076 return _read_buf.append_from_file_descriptor(fd(), size_hint);
2077 }
2078
2079 CHECK_EQ(SSL_CONNECTED, ssl_state());
2080 int ssl_error = 0;
2081 ssize_t nr = 0;
2082 {
2083 BAIDU_SCOPED_LOCK(_ssl_session_mutex);
2084 nr = _read_buf.append_from_SSL_channel(_ssl_session, &ssl_error, size_hint);
2085 }
2086 switch (ssl_error) {
2087 case SSL_ERROR_NONE: // `nr' > 0
2088 break;
2089
2090 case SSL_ERROR_WANT_READ:
2091 // Regard this error as EAGAIN
2092 errno = EAGAIN;
2093 break;
2094
2095 case SSL_ERROR_WANT_WRITE:
2096 // Disable renegotiation
2097 errno = EPROTO;
2098 return -1;
2099

Callers 1

OnNewMessagesMethod · 0.80

Calls 7

ssl_stateFunction · 0.85
fdFunction · 0.85
SSLErrorClass · 0.85
BIO_fd_non_fatal_errorFunction · 0.85
DetectSSLStateFunction · 0.50

Tested by

no test coverage detected