[jira] [Updated] (PROTON-856) idle timeout doesn't work in openssl mode

2015-04-21 Thread Adam Curylo (JIRA)

 [ 
https://issues.apache.org/jira/browse/PROTON-856?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Adam Curylo updated PROTON-856:
---
Description: 
pn_transport_set_idle_timeout doesn't  work properly for ssl connection. 
There is a proper transport-error message (PN_TRANSPORT_ERROR 
amqp:resource-limit-exceeded: local-idle-timeout expired ) after timeout but 
connections still remains. It is different (wrong) behaviour than unencrypted 
connection. 
I've used for check it following example code (connection with ActiveMQ message 
broker):


{code}

#include proton/reactor.h
#include proton/handlers.h
#include proton/engine.h
#include proton/message.h
#include proton/ssl.h
#include assert.h
#include stdio.h
#include string.h


typedef pn_handler_t client_t;

typedef struct {
const char *hostname;
const char *queue;
const char *container;
pn_session_t * session;
pn_ssl_domain_t *sslDomain;
} client_state_t;

client_state_t *client_state(client_t *client) {
return (client_state_t *) pn_handler_mem(client);
}

void client_cleanup(client_t *client) {
client_state_t *cs = client_state(client);
(void)cs;
}

void client_dispatch(pn_handler_t *client, pn_event_t *event, pn_event_type_t 
eventType) {
client_state_t *state = client_state(client);

switch (eventType) {
case PN_TRANSPORT:
{
pn_transport_t * transport = pn_event_transport(event);
assert(transport);
pn_transport_set_idle_timeout(transport, 2);
}
break;
case PN_TRANSPORT_ERROR:
{
pn_transport_t * transport = pn_event_transport(event);
pn_error_t * error = pn_transport_error(transport);
printf(PN_TRANSPORT_ERROR %s \n, pn_error_text(error));
}
break;
case PN_SELECTABLE_INIT:
{
//OpenSSL mode
if (state-sslDomain == NULL) {
state-sslDomain = pn_ssl_domain(PN_SSL_MODE_CLIENT);
}
if (pn_ssl_domain_set_credentials(state-sslDomain, 
./device.polyx.crt, ./device.polyx.key, NULL) == 0) {
pn_connection_t * conn = 
pn_session_connection(state-session);
pn_transport_t * transport = 
pn_connection_transport(conn);
assert(transport);
pn_ssl_init(pn_ssl(transport), state-sslDomain, NULL);
}
}
break;
case PN_DELIVERY:
{

pn_link_t *link = pn_event_link(event);
pn_delivery_t *dlv = pn_event_delivery(event);
if (pn_link_is_receiver(link)  !pn_delivery_partial(dlv)) {
char buf[1024];
ssize_t n = pn_link_recv(link, buf, 1024);
if (n  0) {
pn_message_t *msg = pn_message();
pn_message_decode(msg, buf, n);
pn_string_t *str = pn_string(NULL);
pn_inspect(msg, str);
printf(Got: %s\n, pn_string_get(str));
pn_message_free(msg);
pn_free(str);
}
pn_delivery_settle(dlv);
}
}
break;
default:
break;
}
}

client_t *client_handler(const char *hostName, const char * queueName, const 
char * containerName) {
client_t *client = pn_handler_new(client_dispatch, sizeof(client_state_t), 
client_cleanup);
client_state_t *state = client_state(client);
state-hostname = hostName;
state-queue = queueName;
state-container = containerName;
state-sslDomain = NULL;
state-session = NULL;
return client;
}


int main(int argc, const char **argv) {

pn_reactor_t *reactor = pn_reactor();

pn_handler_t *root = pn_reactor_get_handler(reactor);

client_t *client = client_handler(localhost:5671, queue://example, 
example);
pn_handler_add(root, client);
pn_handler_add(root, pn_flowcontroller(1024));
pn_handler_add(root, pn_handshaker());

client_state_t *state = client_state(client);

pn_connection_t *conn = pn_reactor_connection(reactor, client);
pn_connection_set_container(conn, state-container);
pn_connection_set_hostname(conn, state-hostname);

pn_connection_open(conn);

state-session = pn_session(conn);
pn_session_open(state-session);

pn_link_t * link = pn_receiver(state-session, state-container);
pn_terminus_set_address(pn_link_source(link), state-queue);
pn_terminus_set_address(pn_link_target(link), state-queue);
pn_link_set_snd_settle_mode(link, PN_SND_UNSETTLED);
pn_link_set_rcv_settle_mode(link, PN_RCV_SECOND);
pn_link_open(link);
pn_link_flow(link, 1);

pn_reactor_run(reactor);

if (state-sslDomain != NULL) {
pn_ssl_domain_free(state-sslDomain);
}
pn_reactor_free(reactor);
return 0;
}
 
{code}

  was:
pn_transport_set_idle_timeout doesn't  work properly for ssl connection. 
There is a proper transport-error message (PN_TRANSPORT_ERROR 

[jira] [Updated] (PROTON-856) idle timeout doesn't work in openssl mode

2015-04-21 Thread Adam Curylo (JIRA)

 [ 
https://issues.apache.org/jira/browse/PROTON-856?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Adam Curylo updated PROTON-856:
---
Description: 
pn_transport_set_idle_timeout doesn't  work properly for ssl connection. 
There is a proper transport-error message (PN_TRANSPORT_ERROR 
amqp:resource-limit-exceeded: local-idle-timeout expired ) after timeout but 
connections still remains. It is different (wrong) behaviour than for 
unencrypted connection. 
I've used for check it following example code (connection with ActiveMQ message 
broker):

#include proton/reactor.h
#include proton/handlers.h
#include proton/engine.h
#include proton/message.h
#include proton/ssl.h
#include proton/ssl_io.h
#include assert.h
#include stdio.h
#include string.h


typedef pn_handler_t client_t;

typedef struct {
const char *hostname;
const char *queue;
const char *container;
pn_session_t * session;
pn_ssl_domain_t *sslDomain;
} client_state_t;

client_state_t *client_state(client_t *client) {
return (client_state_t *) pn_handler_mem(client);
}

void client_cleanup(client_t *client) {
client_state_t *cs = client_state(client);
(void)cs;
}

void client_dispatch(pn_handler_t *client, pn_event_t *event, pn_event_type_t 
eventType) {
client_state_t *state = client_state(client);

switch (eventType) {
case PN_TRANSPORT:
{
pn_transport_t * transport = pn_event_transport(event);
assert(transport);
pn_transport_set_idle_timeout(transport, 2);
}
break;
case PN_TRANSPORT_ERROR:
{
pn_transport_t * transport = pn_event_transport(event);
pn_error_t * error = pn_transport_error(transport);
printf(PN_TRANSPORT_ERROR %s \n, pn_error_text(error));
}
break;
case PN_SELECTABLE_INIT:
{
//OpenSSL mode
if (state-sslDomain == NULL) {
state-sslDomain = pn_ssl_domain(PN_SSL_MODE_CLIENT);
}
if (pn_ssl_domain_set_credentials(state-sslDomain, 
./device.polyx.crt, ./device.polyx.key, NULL) == 0) {
pn_connection_t * conn = 
pn_session_connection(state-session);
pn_transport_t * transport = 
pn_connection_transport(conn);
assert(transport);
pn_ssl_init(pn_ssl(transport), state-sslDomain, NULL);
}
}
break;
case PN_DELIVERY:
{

pn_link_t *link = pn_event_link(event);
pn_delivery_t *dlv = pn_event_delivery(event);
if (pn_link_is_receiver(link)  !pn_delivery_partial(dlv)) {
char buf[1024];
ssize_t n = pn_link_recv(link, buf, 1024);
if (n  0) {
pn_message_t *msg = pn_message();
pn_message_decode(msg, buf, n);
pn_string_t *str = pn_string(NULL);
pn_inspect(msg, str);
printf(Got: %s\n, pn_string_get(str));
pn_message_free(msg);
pn_free(str);
}
pn_delivery_settle(dlv);
}
}
break;
default:
break;
}
}

client_t *client_handler(const char *hostName, const char * queueName, const 
char * containerName) {
client_t *client = pn_handler_new(client_dispatch, sizeof(client_state_t), 
client_cleanup);
client_state_t *state = client_state(client);
state-hostname = hostName;
state-queue = queueName;
state-container = containerName;
state-sslDomain = NULL;
state-session = NULL;
return client;
}


int main(int argc, const char **argv) {

pn_reactor_t *reactor = pn_reactor();

pn_handler_t *root = pn_reactor_get_handler(reactor);

client_t *client = client_handler(localhost:5671, queue://example, 
example);
pn_handler_add(root, client);
pn_handler_add(root, pn_flowcontroller(1024));
pn_handler_add(root, pn_handshaker());

client_state_t *state = client_state(client);

pn_connection_t *conn = pn_reactor_connection(reactor, client);
pn_connection_set_container(conn, state-container);
pn_connection_set_hostname(conn, state-hostname);

pn_connection_open(conn);

state-session = pn_session(conn);
pn_session_open(state-session);

pn_link_t * link = pn_receiver(state-session, state-container);
pn_terminus_set_address(pn_link_source(link), state-queue);
pn_terminus_set_address(pn_link_target(link), state-queue);
pn_link_set_snd_settle_mode(link, PN_SND_UNSETTLED);
pn_link_set_rcv_settle_mode(link, PN_RCV_SECOND);
pn_link_open(link);
pn_link_flow(link, 1);

pn_reactor_run(reactor);

if (state-sslDomain != NULL) {
pn_ssl_domain_free(state-sslDomain);
}
pn_reactor_free(reactor);
return 0;
}
 


  was:
pn_transport_set_idle_timeout doesn't  work properly for ssl connection. 
There is a proper transport-error message 

[jira] [Updated] (PROTON-856) idle timeout doesn't work in openssl mode

2015-04-21 Thread Adam Curylo (JIRA)

 [ 
https://issues.apache.org/jira/browse/PROTON-856?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Adam Curylo updated PROTON-856:
---
Description: 
pn_transport_set_idle_timeout doesn't  work properly for ssl connection. 
There is a proper transport-error message (PN_TRANSPORT_ERROR 
amqp:resource-limit-exceeded: local-idle-timeout expired ) after timeout but 
connections still remains. It is different (wrong) behaviour than unencrypted 
connection. 
I've used for check it following example code (connection with ActiveMQ message 
broker):


{code}

#include proton/reactor.h
#include proton/handlers.h
#include proton/engine.h
#include proton/message.h
#include proton/ssl.h
#include proton/ssl_io.h
#include assert.h
#include stdio.h
#include string.h


typedef pn_handler_t client_t;

typedef struct {
const char *hostname;
const char *queue;
const char *container;
pn_session_t * session;
pn_ssl_domain_t *sslDomain;
} client_state_t;

client_state_t *client_state(client_t *client) {
return (client_state_t *) pn_handler_mem(client);
}

void client_cleanup(client_t *client) {
client_state_t *cs = client_state(client);
(void)cs;
}

void client_dispatch(pn_handler_t *client, pn_event_t *event, pn_event_type_t 
eventType) {
client_state_t *state = client_state(client);

switch (eventType) {
case PN_TRANSPORT:
{
pn_transport_t * transport = pn_event_transport(event);
assert(transport);
pn_transport_set_idle_timeout(transport, 2);
}
break;
case PN_TRANSPORT_ERROR:
{
pn_transport_t * transport = pn_event_transport(event);
pn_error_t * error = pn_transport_error(transport);
printf(PN_TRANSPORT_ERROR %s \n, pn_error_text(error));
}
break;
case PN_SELECTABLE_INIT:
{
//OpenSSL mode
if (state-sslDomain == NULL) {
state-sslDomain = pn_ssl_domain(PN_SSL_MODE_CLIENT);
}
if (pn_ssl_domain_set_credentials(state-sslDomain, 
./device.polyx.crt, ./device.polyx.key, NULL) == 0) {
pn_connection_t * conn = 
pn_session_connection(state-session);
pn_transport_t * transport = 
pn_connection_transport(conn);
assert(transport);
pn_ssl_init(pn_ssl(transport), state-sslDomain, NULL);
}
}
break;
case PN_DELIVERY:
{

pn_link_t *link = pn_event_link(event);
pn_delivery_t *dlv = pn_event_delivery(event);
if (pn_link_is_receiver(link)  !pn_delivery_partial(dlv)) {
char buf[1024];
ssize_t n = pn_link_recv(link, buf, 1024);
if (n  0) {
pn_message_t *msg = pn_message();
pn_message_decode(msg, buf, n);
pn_string_t *str = pn_string(NULL);
pn_inspect(msg, str);
printf(Got: %s\n, pn_string_get(str));
pn_message_free(msg);
pn_free(str);
}
pn_delivery_settle(dlv);
}
}
break;
default:
break;
}
}

client_t *client_handler(const char *hostName, const char * queueName, const 
char * containerName) {
client_t *client = pn_handler_new(client_dispatch, sizeof(client_state_t), 
client_cleanup);
client_state_t *state = client_state(client);
state-hostname = hostName;
state-queue = queueName;
state-container = containerName;
state-sslDomain = NULL;
state-session = NULL;
return client;
}


int main(int argc, const char **argv) {

pn_reactor_t *reactor = pn_reactor();

pn_handler_t *root = pn_reactor_get_handler(reactor);

client_t *client = client_handler(localhost:5671, queue://example, 
example);
pn_handler_add(root, client);
pn_handler_add(root, pn_flowcontroller(1024));
pn_handler_add(root, pn_handshaker());

client_state_t *state = client_state(client);

pn_connection_t *conn = pn_reactor_connection(reactor, client);
pn_connection_set_container(conn, state-container);
pn_connection_set_hostname(conn, state-hostname);

pn_connection_open(conn);

state-session = pn_session(conn);
pn_session_open(state-session);

pn_link_t * link = pn_receiver(state-session, state-container);
pn_terminus_set_address(pn_link_source(link), state-queue);
pn_terminus_set_address(pn_link_target(link), state-queue);
pn_link_set_snd_settle_mode(link, PN_SND_UNSETTLED);
pn_link_set_rcv_settle_mode(link, PN_RCV_SECOND);
pn_link_open(link);
pn_link_flow(link, 1);

pn_reactor_run(reactor);

if (state-sslDomain != NULL) {
pn_ssl_domain_free(state-sslDomain);
}
pn_reactor_free(reactor);
return 0;
}
 
{code}

  was:
pn_transport_set_idle_timeout doesn't  work properly for ssl connection. 
There is a proper transport-error message