| 2040 | } |
| 2041 | |
| 2042 | ssize_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 |
no test coverage detected