Fix rabbitmq compatibility

v1.1
Pierrick Charron 2012-11-18 20:20:23 -05:00
parent 71caee45bc
commit 520e311c83
3 changed files with 18 additions and 12 deletions

View File

@ -17,7 +17,10 @@ This extension allows php applications to communicate with any Stomp compliant M
<stability><release>stable</release><api>stable</api></stability> <stability><release>stable</release><api>stable</api></stability>
<license uri="http://www.php.net/license">PHP License</license> <license uri="http://www.php.net/license">PHP License</license>
<notes> <notes>
- Add two new ini options stomp.default_username and stomp.default_passowrd (Pierrick)
- Fix stomp_read_frame when buffered (Pierrick) - Fix stomp_read_frame when buffered (Pierrick)
- Fixed bug #59217 (Connections to RabbitMQ via CLI). (Pierrick).
- Fixed bug #59970 (acking a message makes rabbitmq disconnect the server). (Pierrick)
</notes> </notes>
<contents> <contents>
<dir name="/"> <dir name="/">

23
stomp.c
View File

@ -379,10 +379,12 @@ static int stomp_read_buffer(stomp_t *stomp, char **data)
i++; i++;
if (buffer[i-1] == 0) { if (buffer[i-1] == 0) {
char endline[1]; if (stomp_select_ex(stomp, 0, 0)) {
if (1 != stomp_recv(stomp, endline, 1) && '\n' != endline[0]) { char endline[1];
efree(buffer); if (1 != stomp_recv(stomp, endline, 1) && '\n' != endline[0]) {
return 0; efree(buffer);
return 0;
}
} }
break; break;
} }
@ -555,7 +557,6 @@ stomp_frame_t *stomp_read_frame(stomp_t *stomp)
if (zend_hash_find(f->headers, "content-length", sizeof("content-length"), (void **)&length_str) == SUCCESS) { if (zend_hash_find(f->headers, "content-length", sizeof("content-length"), (void **)&length_str) == SUCCESS) {
int recv = 0; int recv = 0;
char endbuffer[2]; char endbuffer[2];
length = 2;
f->body_length = atoi(length_str); f->body_length = atoi(length_str);
f->body = (char *) emalloc(f->body_length); f->body = (char *) emalloc(f->body_length);
@ -569,9 +570,11 @@ stomp_frame_t *stomp_read_frame(stomp_t *stomp)
} }
} }
if (length != stomp_recv(stomp, endbuffer, length) || endbuffer[0] != '\0' || endbuffer[1] != '\n') { length = stomp_recv(stomp, endbuffer, 2);
if (endbuffer[0] != '\0' || ((2 == length) && (endbuffer[1] != '\n'))) {
RETURN_READ_FRAME_FAIL; RETURN_READ_FRAME_FAIL;
} }
} else { } else {
f->body_length = stomp_read_buffer(stomp, &f->body); f->body_length = stomp_read_buffer(stomp, &f->body);
} }
@ -629,7 +632,7 @@ int stomp_valid_receipt(stomp_t *stomp, stomp_frame_t *frame) {
/* {{{ stomp_select /* {{{ stomp_select
*/ */
int stomp_select(stomp_t *stomp) int stomp_select_ex(stomp_t *stomp, const long int sec, const long int usec)
{ {
int n; int n;
struct timeval tv; struct timeval tv;
@ -637,9 +640,8 @@ int stomp_select(stomp_t *stomp)
if (stomp->buffer) { if (stomp->buffer) {
return 1; return 1;
} }
tv.tv_sec = sec;
tv.tv_sec = stomp->options.read_timeout_sec; tv.tv_usec = usec;
tv.tv_usec = stomp->options.read_timeout_usec;
n = php_pollfd_for(stomp->fd, PHP_POLLREADABLE, &tv); n = php_pollfd_for(stomp->fd, PHP_POLLREADABLE, &tv);
if (n < 1) { if (n < 1) {
@ -650,7 +652,6 @@ int stomp_select(stomp_t *stomp)
#endif #endif
return 0; return 0;
} }
return 1; return 1;
} }
/* }}} */ /* }}} */

View File

@ -81,9 +81,11 @@ void stomp_close(stomp_t *stomp);
int stomp_send(stomp_t *connection, stomp_frame_t *frame TSRMLS_DC); int stomp_send(stomp_t *connection, stomp_frame_t *frame TSRMLS_DC);
stomp_frame_t *stomp_read_frame(stomp_t *connection); stomp_frame_t *stomp_read_frame(stomp_t *connection);
int stomp_valid_receipt(stomp_t *connection, stomp_frame_t *frame); int stomp_valid_receipt(stomp_t *connection, stomp_frame_t *frame);
int stomp_select(stomp_t *connection); int stomp_select_ex(stomp_t *connection, const long int sec, const long int usec);
void stomp_set_error(stomp_t *stomp, const char *error, int errnum, const char *details); void stomp_set_error(stomp_t *stomp, const char *error, int errnum, const char *details);
void stomp_free_frame(stomp_frame_t *frame); void stomp_free_frame(stomp_frame_t *frame);
#define stomp_select(s) stomp_select_ex(s, s->options.read_timeout_sec, s->options.read_timeout_sec)
#endif /* _STOMP_H_ */ #endif /* _STOMP_H_ */
/* /*