refactored uwsgi_parse_response to uwsgi_parse_packet

This commit is contained in:
roberto@debian32
2011-06-15 14:01:00 +02:00
parent 8af700ce37
commit 7673cdb1aa
9 changed files with 76 additions and 44 deletions
+14 -11
View File
@@ -16,7 +16,7 @@ struct option nagios_options[] = {
int nagios() {
char *tcp_port;
struct pollfd nagios_poll;
struct wsgi_request nagios_req;
// connect and send
if (!use_nagios) {
@@ -34,27 +34,30 @@ int nagios() {
tcp_port[0] = 0;
nagios_poll.fd = connect_to_tcp(uwsgi.sockets->name, atoi(tcp_port + 1), uwsgi.shared->options[UWSGI_OPTION_SOCKET_TIMEOUT], 0);
if (nagios_poll.fd < 0) {
int fd = connect_to_tcp(uwsgi.sockets->name, atoi(tcp_port + 1), uwsgi.shared->options[UWSGI_OPTION_SOCKET_TIMEOUT], 0);
if (fd < 0) {
fprintf(stdout, "UWSGI CRITICAL: could not connect() to workers\n");
exit(2);
}
uwsgi.wsgi_req->uh.modifier1 = UWSGI_MODIFIER_PING;
uwsgi.wsgi_req->uh.pktsize = 0;
uwsgi.wsgi_req->uh.modifier2 = 0;
if (write(nagios_poll.fd, uwsgi.wsgi_req, 4) != 4) {
nagios_req.uh.modifier1 = UWSGI_MODIFIER_PING;
nagios_req.uh.pktsize = 0;
nagios_req.uh.modifier2 = 0;
if (write(fd, &nagios_req.uh, 4) != 4) {
uwsgi_error("write()");
fprintf(stdout, "UWSGI CRITICAL: could not send ping packet to workers\n");
exit(2);
}
nagios_poll.events = POLLIN;
if (!uwsgi_parse_response(&nagios_poll, uwsgi.shared->options[UWSGI_OPTION_SOCKET_TIMEOUT], (struct uwsgi_header *) uwsgi.wsgi_req, uwsgi.wsgi_req->buffer, uwsgi_proto_uwsgi_parser)) {
nagios_req.poll.fd = fd;
nagios_req.poll.events = POLLIN;
if (!uwsgi_parse_packet(&nagios_req, uwsgi.shared->options[UWSGI_OPTION_SOCKET_TIMEOUT])) {
fprintf(stdout, "UWSGI CRITICAL: timed out waiting for response\n");
exit(2);
}
else {
if (uwsgi.wsgi_req->uh.pktsize > 0) {
fprintf(stdout, "UWSGI WARNING: %.*s\n", uwsgi.wsgi_req->uh.pktsize, uwsgi.wsgi_req->buffer);
if (nagios_req.uh.pktsize > 0) {
fprintf(stdout, "UWSGI WARNING: %.*s\n", nagios_req.uh.pktsize, nagios_req.buffer);
exit(1);
}
else {
+18 -11
View File
@@ -15,32 +15,38 @@ struct option uwsgi_ping_options[] = {
static void ping() {
struct uwsgi_header uh;
struct pollfd uwsgi_poll;
struct wsgi_request ping_req;
char *buf = uwsgi_malloc(uwsgi.buffer_size);
// use a 3 secs timeout by default
if (!uping.ping_timeout) uping.ping_timeout = 3;
uwsgi_log("PING uwsgi host %s (timeout: %d)\n", uping.ping, uping.ping_timeout);
uwsgi_poll.fd = uwsgi_connect(uping.ping, uping.ping_timeout, 0);
if (uwsgi_poll.fd < 0) {
int fd = uwsgi_connect(uping.ping, uping.ping_timeout, 0);
if (fd < 0) {
exit(1);
}
uh.modifier1 = UWSGI_MODIFIER_PING;
uh.pktsize = 0;
uh.modifier2 = 0;
if (write(uwsgi_poll.fd, &uh, 4) != 4) {
memset(&ping_req, 0, sizeof(struct wsgi_request));
ping_req.uh.modifier1 = UWSGI_MODIFIER_PING;
ping_req.uh.pktsize = 0;
ping_req.uh.modifier2 = 0;
if (write(fd, &ping_req.uh, 4) != 4) {
uwsgi_error("write()");
exit(2);
}
uwsgi_poll.events = POLLIN;
if (!uwsgi_parse_response(&uwsgi_poll, uping.ping_timeout, &uh, NULL, uwsgi_proto_uwsgi_parser)) {
ping_req.poll.fd = fd;
ping_req.poll.events = POLLIN;
ping_req.buffer = buf;
if (!uwsgi_parse_packet(&ping_req, uping.ping_timeout)) {
exit(1);
}
else {
if (uh.pktsize > 0) {
if (ping_req.uh.pktsize > 0) {
uwsgi_log("[WARNING] node %s message: %.*s\n", uping.ping, ping_req.uh.pktsize, buf);
exit(2);
}
else {
@@ -92,6 +98,7 @@ int uwsgi_ping_manage_options(int i, char *optarg) {
switch(i) {
case LONG_ARGS_PING:
uwsgi.no_server = 1;
uping.ping = optarg;
return 1;
case LONG_ARGS_PING_TIMEOUT:
+7 -6
View File
@@ -319,7 +319,6 @@ PyObject *py_uwsgi_rpc(PyObject * self, PyObject * args) {
int rlen;
int rpc_args = 0;
struct pollfd upoll;
// TODO better error reporting
if (argc < 2)
@@ -405,11 +404,10 @@ PyObject *py_uwsgi_rpc(PyObject * self, PyObject * args) {
rlen = uwsgi_waitfd(fd, uwsgi.shared->options[UWSGI_OPTION_SOCKET_TIMEOUT]);
if (rlen > 0) {
upoll.fd = fd;
upoll.events = POLLIN;
rpc_req.poll.fd = fd;
rpc_req.poll.events = POLLIN;
rpc_req.buffer = buffer;
if (uwsgi_parse_response(&upoll, uwsgi.shared->options[UWSGI_OPTION_SOCKET_TIMEOUT], (struct uwsgi_header *)&rpc_req, buffer, uwsgi_proto_uwsgi_parser)) {
if (uwsgi_parse_packet(&rpc_req, uwsgi.shared->options[UWSGI_OPTION_SOCKET_TIMEOUT])) {
size = rpc_req.uh.pktsize;
}
}
@@ -1246,7 +1244,7 @@ PyObject *py_uwsgi_send_multi_message(PyObject * self, PyObject * args) {
int managed;
struct pollfd *multipoll;
char *buffer;
struct uwsgi_header uh;
PyObject *arg_cluster;
PyObject *cluster_node;
@@ -1360,9 +1358,11 @@ PyObject *py_uwsgi_send_multi_message(PyObject * self, PyObject * args) {
goto megamulticlear;
}
else {
// TODO fix
/*
for (i = 0; i < clen; i++) {
if (multipoll[i].revents & POLLIN) {
if (!uwsgi_parse_response(&multipoll[i], PyInt_AsLong(arg_timeout), &uh, &buffer[i], uwsgi_proto_uwsgi_parser)) {
if (!uwsgi_parse_packet(&multipoll[i], PyInt_AsLong(arg_timeout), &uh, &buffer[i], uwsgi_proto_uwsgi_parser)) {
goto megamulticlear;
}
else {
@@ -1375,6 +1375,7 @@ PyObject *py_uwsgi_send_multi_message(PyObject * self, PyObject * args) {
}
}
}
*/
}
}
+16 -2
View File
@@ -5,8 +5,8 @@ extern struct uwsgi_server uwsgi;
int uwsgi_rpc_request(struct wsgi_request *wsgi_req) {
char *argv[0xff];
uint8_t argc;
char *argv[256];
uint8_t argc = 0xff;
/* Standard RPC request */
if (!wsgi_req->uh.pktsize) {
@@ -14,10 +14,24 @@ int uwsgi_rpc_request(struct wsgi_request *wsgi_req) {
return -1;
}
/*
for(argc=0;argc<wsgi_req->uh.pktsize;argc++) {
uwsgi_log("rpc: %c\n", wsgi_req->buffer[argc]);
}
*/
#ifdef UWSGI_DEBUG
uwsgi_log("RPC pktsize %d\n", wsgi_req->uh.pktsize);
#endif
if (uwsgi_parse_array(wsgi_req->buffer, wsgi_req->uh.pktsize, argv, &argc)) {
uwsgi_log("Invalid RPC request. skip.\n");
return -1;
}
#ifdef UWSGI_DEBUG
uwsgi_log("RPC args %d\n", argc-1);
#endif
wsgi_req->uh.pktsize = uwsgi_rpc(argv[0], argc-1, argv+1, wsgi_req->buffer);
+17 -10
View File
@@ -339,7 +339,7 @@ ssize_t uwsgi_send_message(int fd, uint8_t modifier1, uint8_t modifier2, char *m
}
int uwsgi_parse_response(struct pollfd *upoll, int timeout, struct uwsgi_header *uh, char *buffer, int (*socket_proto)(struct wsgi_request *)) {
int uwsgi_parse_packet(struct wsgi_request *wsgi_req, int timeout) {
int rlen;
int status = UWSGI_AGAIN;
@@ -347,7 +347,7 @@ int uwsgi_parse_response(struct pollfd *upoll, int timeout, struct uwsgi_header
timeout = 1;
while(status == UWSGI_AGAIN) {
rlen = poll(upoll, 1, timeout * 1000);
rlen = poll(&wsgi_req->poll, 1, timeout * 1000);
if (rlen < 0) {
uwsgi_error("poll()");
exit(1);
@@ -357,7 +357,12 @@ int uwsgi_parse_response(struct pollfd *upoll, int timeout, struct uwsgi_header
//close(upoll->fd);
return 0;
}
status = socket_proto((struct wsgi_request *) uh);
if (wsgi_req->socket) {
status = wsgi_req->socket->proto(wsgi_req);
}
else {
status = uwsgi_proto_uwsgi_parser(wsgi_req);
}
if (status < 0) {
uwsgi_log("error parsing request\n");
//close(upoll->fd);
@@ -393,6 +398,7 @@ int uwsgi_parse_array(char *buffer, uint16_t size, char **argv, uint8_t *argc) {
if (ptrbuf + strsize <= bufferend) {
// item
argv[*argc] = uwsgi_cheap_string(ptrbuf, strsize);
uwsgi_log("arg %s\n", argv[*argc]);
ptrbuf += strsize;
*argc = *argc + 1;
}
@@ -754,7 +760,7 @@ int uwsgi_ping_node(int node, struct wsgi_request *wsgi_req) {
}
uwsgi_poll.events = POLLIN;
if (!uwsgi_parse_response(&uwsgi_poll, uwsgi.shared->options[UWSGI_OPTION_SOCKET_TIMEOUT], (struct uwsgi_header *) wsgi_req, wsgi_req->buffer, uwsgi_proto_uwsgi_parser)) {
if (!uwsgi_parse_packet(wsgi_req, uwsgi.shared->options[UWSGI_OPTION_SOCKET_TIMEOUT])) {
return -1;
}
@@ -1096,8 +1102,7 @@ uint16_t fcgi_get_record(int fd, char *buf) {
char *uwsgi_simple_message_string(char *socket_name, uint8_t modifier1, uint8_t modifier2, char *what, uint16_t what_len, char *buffer, uint16_t *response_len, int timeout) {
struct uwsgi_header uh;
struct pollfd upoll;
struct wsgi_request msg_req;
int fd = uwsgi_connect(socket_name, timeout, 0);
@@ -1112,17 +1117,19 @@ char *uwsgi_simple_message_string(char *socket_name, uint8_t modifier1, uint8_t
return NULL;
}
upoll.fd = fd;
upoll.events = POLLIN;
memset(&msg_req, 0, sizeof(struct wsgi_request));
msg_req.poll.fd = fd;
msg_req.poll.events = POLLIN;
msg_req.buffer = buffer;
if (buffer) {
if (!uwsgi_parse_response(&upoll, timeout, &uh, buffer, uwsgi_proto_uwsgi_parser)) {
if (!uwsgi_parse_packet(&msg_req, timeout)) {
close(fd);
if (response_len) *response_len = 0;
return NULL;
}
if (response_len) *response_len = uh.pktsize;
if (response_len) *response_len = msg_req.uh.pktsize;
}
close(fd);
+1 -1
View File
@@ -716,7 +716,7 @@ int wsgi_req_recv(struct wsgi_request *wsgi_req) {
gettimeofday(&wsgi_req->start_of_request, NULL);
if (!wsgi_req->socket->edge_trigger) {
if (!uwsgi_parse_response(&wsgi_req->poll, uwsgi.shared->options[UWSGI_OPTION_SOCKET_TIMEOUT], (struct uwsgi_header *) wsgi_req, wsgi_req->buffer, wsgi_req->socket->proto)) {
if (!uwsgi_parse_packet(wsgi_req, uwsgi.shared->options[UWSGI_OPTION_SOCKET_TIMEOUT])) {
return -1;
}
}
-2
View File
@@ -746,8 +746,6 @@ int main(int argc, char *argv[], char *envp[]) {
char *magic_table[0xff];
char *optname;
uwsgi_log("size = %d\n", sizeof(struct cmsghdr) + CMSG_SPACE(sizeof(int)));
signal(SIGHUP, SIG_IGN);
signal(SIGTERM, SIG_IGN);
+1 -1
View File
@@ -1508,7 +1508,7 @@ uint64_t uwsgi_swap64(uint64_t);
ssize_t send_udp_message(uint8_t, char *, char *, uint16_t);
#endif
int uwsgi_parse_response(struct pollfd *, int, struct uwsgi_header *, char *, int (*)(struct wsgi_request *));
int uwsgi_parse_packet(struct wsgi_request *, int);
int uwsgi_parse_vars(struct wsgi_request *);
int uwsgi_enqueue_message(char *, int, uint8_t, uint8_t, char *, int, int);
+2
View File
@@ -7,4 +7,6 @@ def hello_world(name):
uwsgi.register_rpc("hello", hello_world)
uwsgi.set_warning_message("uWSGI is running the Control Center")
application = app