static ssize_t pn_input_read_sasl(pn_transport_t* transport, unsigned int layer, const char* bytes, size_t available) { pni_sasl_t *sasl = transport->sasl; bool eos = pn_transport_capacity(transport)==PN_EOS; if (eos) { pn_do_error(transport, "amqp:connection:framing-error", "connection aborted"); pn_set_error_layer(transport); return PN_EOS; } pni_sasl_start_server_if_needed(transport); if (!pni_sasl_is_final_input_state(sasl)) { return pn_dispatcher_input(transport, bytes, available, false, &transport->halt); } if (pni_sasl_impl_can_encrypt(transport)) { sasl->max_encrypt_size = pni_sasl_impl_max_encrypt_size(transport); if (transport->trace & PN_TRACE_DRV) pn_transport_logf(transport, "SASL Encryption enabled: buffer=%d", sasl->max_encrypt_size); transport->io_layers[layer] = &sasl_encrypt_layer; } else if (sasl->client) { transport->io_layers[layer] = &pni_passthru_layer; } else { return pni_passthru_layer.process_input(transport, layer, bytes, available); } return transport->io_layers[layer]->process_input(transport, layer, bytes, available); }
static ssize_t pn_input_read_sasl_header(pn_transport_t* transport, unsigned int layer, const char* bytes, size_t available) { bool eos = pn_transport_capacity(transport)==PN_EOS; pni_protocol_type_t protocol = pni_sniff_header(bytes, available); switch (protocol) { case PNI_PROTOCOL_AMQP_SASL: if (transport->io_layers[layer] == &sasl_read_header_layer) { transport->io_layers[layer] = &sasl_layer; } else { transport->io_layers[layer] = &sasl_write_header_layer; } if (transport->trace & PN_TRACE_FRM) pn_transport_logf(transport, " <- %s", "SASL"); pni_sasl_set_external_security(transport, pn_ssl_get_ssf((pn_ssl_t*)transport), pn_ssl_get_remote_subject((pn_ssl_t*)transport)); return SASL_HEADER_LEN; case PNI_PROTOCOL_INSUFFICIENT: if (!eos) return 0; /* Fallthru */ default: break; } char quoted[1024]; pn_quote_data(quoted, 1024, bytes, available); pn_do_error(transport, "amqp:connection:framing-error", "%s header mismatch: %s ['%s']%s", "SASL", pni_protocol_name(protocol), quoted, !eos ? "" : " (connection aborted)"); pn_set_error_layer(transport); return PN_EOS; }
mutable_buffer connection_engine::read_buffer() { ssize_t cap = pn_transport_capacity(unwrap(transport_)); if (cap > 0) return mutable_buffer(pn_transport_tail(unwrap(transport_)), cap); else return mutable_buffer(0, 0); }
static ssize_t pni_connection_capacity(pn_selectable_t *sel) { pn_transport_t *transport = pni_transport(sel); ssize_t capacity = pn_transport_capacity(transport); if (capacity < 0) { if (pn_transport_closed(transport)) { pn_selectable_terminate(sel); } } return capacity; }
size_t connection_engine::can_read() const { return std::max(ssize_t(0), pn_transport_capacity(ctx_->transport)); }