| 1040 | } |
| 1041 | |
| 1042 | static apr_status_t h2_proxy_session_read(h2_proxy_session *session, int block, |
| 1043 | apr_interval_time_t timeout) |
| 1044 | { |
| 1045 | apr_status_t status = APR_SUCCESS; |
| 1046 | |
| 1047 | if (APR_BRIGADE_EMPTY(session->input)) { |
| 1048 | apr_socket_t *socket = NULL; |
| 1049 | apr_time_t save_timeout = -1; |
| 1050 | |
| 1051 | if (block && timeout > 0) { |
| 1052 | socket = ap_get_conn_socket(session->c); |
| 1053 | if (socket) { |
| 1054 | apr_socket_timeout_get(socket, &save_timeout); |
| 1055 | apr_socket_timeout_set(socket, timeout); |
| 1056 | } |
| 1057 | else { |
| 1058 | /* cannot block on timeout */ |
| 1059 | ap_log_cerror(APLOG_MARK, APLOG_WARNING, 0, session->c, APLOGNO(03379) |
| 1060 | "h2_proxy_session(%s): unable to get conn socket", |
| 1061 | session->id); |
| 1062 | return APR_ENOTIMPL; |
| 1063 | } |
| 1064 | } |
| 1065 | |
| 1066 | status = ap_get_brigade(session->c->input_filters, session->input, |
| 1067 | AP_MODE_READBYTES, |
| 1068 | block? APR_BLOCK_READ : APR_NONBLOCK_READ, |
| 1069 | 64 * 1024); |
| 1070 | ap_log_cerror(APLOG_MARK, APLOG_TRACE3, status, session->c, |
| 1071 | "h2_proxy_session(%s): read from conn", session->id); |
| 1072 | if (socket && save_timeout != -1) { |
| 1073 | apr_socket_timeout_set(socket, save_timeout); |
| 1074 | } |
| 1075 | } |
| 1076 | |
| 1077 | if (status == APR_SUCCESS) { |
| 1078 | status = feed_brigade(session, session->input); |
| 1079 | } |
| 1080 | else if (APR_STATUS_IS_TIMEUP(status)) { |
| 1081 | /* nop */ |
| 1082 | } |
| 1083 | else if (!APR_STATUS_IS_EAGAIN(status)) { |
| 1084 | ap_log_cerror(APLOG_MARK, APLOG_DEBUG, status, session->c, APLOGNO(03380) |
| 1085 | "h2_proxy_session(%s): read error", session->id); |
| 1086 | dispatch_event(session, H2_PROXYS_EV_CONN_ERROR, status, NULL); |
| 1087 | } |
| 1088 | |
| 1089 | return status; |
| 1090 | } |
| 1091 | |
| 1092 | apr_status_t h2_proxy_session_submit(h2_proxy_session *session, |
| 1093 | const char *url, request_rec *r, |
no test coverage detected