if (http_server_connection_unref_is_closed(conn) || ret < 0)
return -1;
- if (ret > 0) {
- i_assert(!conn->output_locked);
-
+ if (!conn->output_locked) {
/* Room for more responses */
ret = http_server_connection_send_responses(conn);
if (ret < 0)
http_server_connection_unref(&conn);
}
-void http_server_ostream_continue(struct http_server_ostream *hsostream)
+int http_server_ostream_continue(struct http_server_ostream *hsostream)
{
struct wrapper_ostream *wostream = &hsostream->wostream;
struct http_server_response *resp = hsostream->resp;
i_assert(hsostream->response_destroyed ||
resp->request->state >= HTTP_SERVER_REQUEST_STATE_PAYLOAD_OUT);
- wrapper_ostream_continue(wostream);
+ return wrapper_ostream_continue(wostream);
}
bool http_server_ostream_get_size(struct http_server_ostream *hsostream,
size_t max_buffer_size, bool blocking);
bool http_server_ostream_get_size(struct http_server_ostream *hsostream,
uoff_t *size_r);
-void http_server_ostream_continue(struct http_server_ostream *hsostream);
+int http_server_ostream_continue(struct http_server_ostream *hsostream);
void http_server_ostream_output_available(
struct http_server_ostream *hsostream);
if (resp->payload_stream != NULL) {
conn->output_locked = TRUE;
- http_server_ostream_continue(resp->payload_stream);
- return (conn->output_locked ? 0 : 1);
+ return http_server_ostream_continue(resp->payload_stream);
}
i_assert(resp->payload_input != NULL);
http_server_connection_stop_idle_timeout(conn);
conn->io_resp_payload = io_add_istream(resp->payload_input,
http_server_response_payload_input, resp);
- return 0;
+ return 1;
case OSTREAM_SEND_ISTREAM_RESULT_WAIT_OUTPUT:
/* Output is blocking (client needs to act; enable timeout) */
conn->output_locked = TRUE;
} else {
/* No payload to send */
e_debug(resp->event, "No payload to send");
- if (resp->payload_stream != NULL)
- http_server_ostream_continue(resp->payload_stream);
+ if (resp->payload_stream != NULL) {
+ ret = http_server_ostream_continue(resp->payload_stream);
+ if (ret < 0)
+ return -1;
+ }
conn->output_locked = FALSE;
- http_server_response_finish_payload_out(resp);
+ ret = http_server_response_finish_payload_out(resp);
+ if (ret < 0)
+ return -1;
}
if (conn->conn.output != NULL && !resp->payload_corked &&