PROTON-1003: add SSL error handler callback
Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/c56bcff5 Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/c56bcff5 Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/c56bcff5 Branch: refs/heads/proton-go Commit: c56bcff5fc3f5f5087ed227e1dd11d7b835df819 Parents: 84e416e Author: Gordon Sim <[email protected]> Authored: Thu Sep 24 15:29:48 2015 -0400 Committer: Ken Giusti <[email protected]> Committed: Thu Sep 24 15:29:48 2015 -0400 ---------------------------------------------------------------------- proton-c/src/engine/engine-internal.h | 2 +- proton-c/src/sasl/sasl.c | 4 ++-- proton-c/src/ssl/openssl.c | 14 ++++++++++---- proton-c/src/transport/transport.c | 8 ++++---- 4 files changed, 17 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c56bcff5/proton-c/src/engine/engine-internal.h ---------------------------------------------------------------------- diff --git a/proton-c/src/engine/engine-internal.h b/proton-c/src/engine/engine-internal.h index faba488..0b052a7 100644 --- a/proton-c/src/engine/engine-internal.h +++ b/proton-c/src/engine/engine-internal.h @@ -100,7 +100,7 @@ typedef struct { typedef struct pn_io_layer_t { ssize_t (*process_input)(struct pn_transport_t *transport, unsigned int layer, const char *, size_t); ssize_t (*process_output)(struct pn_transport_t *transport, unsigned int layer, char *, size_t); - void (*handle_error)(struct pn_transport_t* transport); + void (*handle_error)(struct pn_transport_t* transport, unsigned int layer); pn_timestamp_t (*process_tick)(struct pn_transport_t *transport, unsigned int layer, pn_timestamp_t); size_t (*buffered_output)(struct pn_transport_t *transport); // how much output is held } pn_io_layer_t; http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c56bcff5/proton-c/src/sasl/sasl.c ---------------------------------------------------------------------- diff --git a/proton-c/src/sasl/sasl.c b/proton-c/src/sasl/sasl.c index fb98894..994082c 100644 --- a/proton-c/src/sasl/sasl.c +++ b/proton-c/src/sasl/sasl.c @@ -49,7 +49,7 @@ static ssize_t pn_input_read_sasl_encrypt(pn_transport_t *transport, unsigned in static ssize_t pn_output_write_sasl_header(pn_transport_t* transport, unsigned int layer, char* bytes, size_t size); static ssize_t pn_output_write_sasl(pn_transport_t *transport, unsigned int layer, char *bytes, size_t available); static ssize_t pn_output_write_sasl_encrypt(pn_transport_t *transport, unsigned int layer, char *bytes, size_t available); -static void pn_error_sasl(pn_transport_t* transport); +static void pn_error_sasl(pn_transport_t* transport, unsigned int layer); const pn_io_layer_t sasl_header_layer = { pn_input_read_sasl_header, @@ -253,7 +253,7 @@ static void pni_post_sasl_frame(pn_transport_t *transport) } } -static void pn_error_sasl(pn_transport_t* transport) +static void pn_error_sasl(pn_transport_t* transport, unsigned int layer) { transport->close_sent = true; pni_sasl_set_desired_state(transport, SASL_ERROR); http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c56bcff5/proton-c/src/ssl/openssl.c ---------------------------------------------------------------------- diff --git a/proton-c/src/ssl/openssl.c b/proton-c/src/ssl/openssl.c index 2781a5b..8710225 100644 --- a/proton-c/src/ssl/openssl.c +++ b/proton-c/src/ssl/openssl.c @@ -142,6 +142,7 @@ struct pn_ssl_session_t { /* */ static int keyfile_pw_cb(char *buf, int size, int rwflag, void *userdata); +static void handle_error_ssl( pn_transport_t *transport, unsigned int layer); static ssize_t process_input_ssl( pn_transport_t *transport, unsigned int layer, const char *input_data, size_t len); static ssize_t process_output_ssl( pn_transport_t *transport, unsigned int layer, char *input_data, size_t len); static ssize_t process_input_done(pn_transport_t *transport, unsigned int layer, const char *input_data, size_t len); @@ -682,7 +683,7 @@ int pn_ssl_domain_set_peer_authentication(pn_ssl_domain_t *domain, const pn_io_layer_t ssl_layer = { process_input_ssl, process_output_ssl, - NULL, + handle_error_ssl, NULL, buffered_output }; @@ -690,7 +691,7 @@ const pn_io_layer_t ssl_layer = { const pn_io_layer_t ssl_input_closed_layer = { process_input_done, process_output_ssl, - NULL, + handle_error_ssl, NULL, buffered_output }; @@ -698,7 +699,7 @@ const pn_io_layer_t ssl_input_closed_layer = { const pn_io_layer_t ssl_output_closed_layer = { process_input_ssl, process_output_done, - NULL, + handle_error_ssl, NULL, buffered_output }; @@ -706,7 +707,7 @@ const pn_io_layer_t ssl_output_closed_layer = { const pn_io_layer_t ssl_closed_layer = { process_input_done, process_output_done, - NULL, + handle_error_ssl, NULL, buffered_output }; @@ -1022,6 +1023,11 @@ static ssize_t process_input_ssl( pn_transport_t *transport, unsigned int layer, return consumed; } +static void handle_error_ssl(pn_transport_t *transport, unsigned int layer) +{ + transport->io_layers[layer] = &ssl_closed_layer; +} + static ssize_t process_output_ssl( pn_transport_t *transport, unsigned int layer, char *buffer, size_t max_len) { pni_ssl_t *ssl = transport->ssl; http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c56bcff5/proton-c/src/transport/transport.c ---------------------------------------------------------------------- diff --git a/proton-c/src/transport/transport.c b/proton-c/src/transport/transport.c index 96ac2a8..8edc9b3 100644 --- a/proton-c/src/transport/transport.c +++ b/proton-c/src/transport/transport.c @@ -141,7 +141,7 @@ static ssize_t pn_input_read_amqp_header(pn_transport_t *transport, unsigned int static ssize_t pn_input_read_amqp(pn_transport_t *transport, unsigned int layer, const char *bytes, size_t available); static ssize_t pn_output_write_amqp_header(pn_transport_t *transport, unsigned int layer, char *bytes, size_t available); static ssize_t pn_output_write_amqp(pn_transport_t *transport, unsigned int layer, char *bytes, size_t available); -static void pn_error_amqp(pn_transport_t *transport); +static void pn_error_amqp(pn_transport_t *transport, unsigned int layer); static pn_timestamp_t pn_tick_amqp(pn_transport_t *transport, unsigned int layer, pn_timestamp_t now); static ssize_t pn_io_layer_input_autodetect(pn_transport_t *transport, unsigned int layer, const char *bytes, size_t available); @@ -1100,7 +1100,7 @@ int pn_do_error(pn_transport_t *transport, const char *condition, const char *fm for (int i = 0; i<PN_IO_LAYER_CT; ++i) { if (transport->io_layers[i] && transport->io_layers[i]->handle_error) - transport->io_layers[i]->handle_error(transport); + transport->io_layers[i]->handle_error(transport, i); } pni_close_tail(transport); @@ -2413,7 +2413,7 @@ static int pni_process(pn_transport_t *transport) #define AMQP_HEADER ("AMQP\x00\x01\x00\x00") -static void pn_error_amqp(pn_transport_t* transport) +static void pn_error_amqp(pn_transport_t* transport, unsigned int layer) { if (!transport->close_sent) { if (!transport->open_sent) { @@ -2529,7 +2529,7 @@ static ssize_t pn_output_write_amqp_header(pn_transport_t* transport, unsigned i assert(available >= 8); memmove(bytes, AMQP_HEADER, 8); if (pn_condition_is_set(&transport->condition)) { - pn_error_amqp(transport); + pn_error_amqp(transport, layer); transport->io_layers[layer] = &pni_error_layer; return pn_dispatcher_output(transport, bytes+8, available-8) + 8; } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
