This is an automated email from the ASF dual-hosted git repository. kgiusti pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/qpid-dispatch.git
commit bae8bcf615fa3ce8fa5e8061f5de377f211501f7 Author: Kenneth Giusti <[email protected]> AuthorDate: Thu Dec 10 17:20:24 2020 -0500 DISPATCH-1744: bugfix - properly set outcome on invalid response messages --- src/adaptors/http1/http1_client.c | 36 +++++++++++++++++++++++++----------- src/adaptors/http1/http1_server.c | 5 ++++- 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/adaptors/http1/http1_client.c b/src/adaptors/http1/http1_client.c index 4093c10..952c992 100644 --- a/src/adaptors/http1/http1_client.c +++ b/src/adaptors/http1/http1_client.c @@ -487,16 +487,18 @@ static void _handle_connection_events(pn_event_t *e, qd_server_t *qd_server, voi DEQ_IS_EMPTY(rmsg->out_data.fifo) && hconn->cfg.aggregation == QD_AGGREGATION_NONE) { // response message fully received and forwarded to client - qd_log(qdr_http1_adaptor->log, QD_LOG_TRACE, - "[C%"PRIu64"][L%"PRIu64"] HTTP client request msg-id=%"PRIu64" settling response, dispo=0x%"PRIx64, - hconn->conn_id, hconn->out_link_id, hreq->base.msg_id, rmsg->dispo); - qdr_delivery_remote_state_updated(qdr_http1_adaptor->core, - rmsg->dlv, - rmsg->dispo, - true, // settled, - 0, // error - 0, // dispo data - false); + if (rmsg->dlv) { + qd_log(qdr_http1_adaptor->log, QD_LOG_TRACE, + "[C%"PRIu64"][L%"PRIu64"] HTTP client request msg-id=%"PRIu64" settling response, dispo=0x%"PRIx64, + hconn->conn_id, hconn->out_link_id, hreq->base.msg_id, rmsg->dispo); + qdr_delivery_remote_state_updated(qdr_http1_adaptor->core, + rmsg->dlv, + rmsg->dispo, + true, // settled, + 0, // error + 0, // dispo data + false); + } qdr_link_flow(qdr_http1_adaptor->core, hconn->out_link, 1, false); _client_response_msg_free(hreq, rmsg); rmsg = DEQ_HEAD(hreq->responses); @@ -1208,7 +1210,7 @@ void qdr_http1_client_core_delivery_update(qdr_http1_adaptor_t *adaptor, "[C%"PRIu64"][L%"PRIu64"] HTTP request msg-id=%"PRIu64" failure, outcome=0x%"PRIx64, hconn->conn_id, hconn->in_link_id, hreq->base.msg_id, disp); - if (DEQ_IS_EMPTY(hreq->responses)) { + if (hreq->base.out_http1_octets == 0) { // best effort attempt to send an error to the client // if nothing has been sent back so far _client_response_msg_t *rmsg = new__client_response_msg_t(); @@ -1535,11 +1537,23 @@ uint64_t qdr_http1_client_core_link_deliver(qdr_http1_adaptor_t *adaptor, bool need_close = false; h1_codec_tx_done(hreq->base.lib_rs, &need_close); hreq->close_on_complete = need_close || hreq->close_on_complete; + + qd_log(qdr_http1_adaptor->log, QD_LOG_DEBUG, + "[C%"PRIu64"][L%"PRIu64"] HTTP response message msg-id=%"PRIu64" encoding complete", + hconn->conn_id, link->identity, hreq->base.msg_id); + } else { // The response was bad. There's not much that can be done to // recover, so for now I punt... qd_message_set_discard(msg, true); + + // returning a terminal disposition will cause the delivery to be updated and settled, + // so drop our reference + qdr_delivery_set_context(rmsg->dlv, 0); + qdr_delivery_decref(qdr_http1_adaptor->core, rmsg->dlv, "malformed HTTP1 response, delivery released"); + rmsg->dlv = 0; qdr_http1_close_connection(hconn, "Cannot parse response message"); + return rmsg->dispo; } } } diff --git a/src/adaptors/http1/http1_server.c b/src/adaptors/http1/http1_server.c index cffcb5c..8f03fe7 100644 --- a/src/adaptors/http1/http1_server.c +++ b/src/adaptors/http1/http1_server.c @@ -1449,7 +1449,10 @@ uint64_t qdr_http1_server_core_link_deliver(qdr_http1_adaptor_t *adaptor, if (hreq->request_dispo) { qd_message_set_send_complete(msg); if (hreq->request_dispo == PN_ACCEPTED) { - h1_codec_tx_done(hreq->base.lib_rs, &hreq->close_on_complete); + bool need_close = false; + h1_codec_tx_done(hreq->base.lib_rs, &need_close); + hreq->close_on_complete = need_close || hreq->close_on_complete; + qd_log(qdr_http1_adaptor->log, QD_LOG_DEBUG, "[C%"PRIu64"][L%"PRIu64"] HTTP request message msg-id=%"PRIu64" encoding complete", hconn->conn_id, link->identity, hreq->base.msg_id); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
