Compare commits

...
7 Commits
Author SHA1 Message Date
Unbit ccf298a148 updated gemspec 2013-04-23 14:29:45 +02:00
Unbit 914b600af4 prepare for 1.9.8 2013-04-23 14:27:47 +02:00
Unbit 4944994667 fixed #244 2013-04-23 14:27:08 +02:00
Unbit 3a487578a5 remove annoying logline in async mode 2013-04-23 10:10:13 +02:00
Unbit 39eeccb16a refactored async runqueue management 2013-04-23 10:02:36 +02:00
Roberta Giordano 32acd3b9d1 added the flush instruction 2013-04-23 07:07:53 +02:00
Roberta Giordano c57baae477 mime route var has to take variables 2013-04-23 06:46:47 +02:00
8 changed files with 57 additions and 27 deletions
+11 -16
View File
@@ -52,7 +52,7 @@ static void runqueue_remove(struct uwsgi_async_request *u_request) {
child->prev = parent;
}
if (parent == NULL) {
if (u_request == uwsgi.async_runqueue) {
uwsgi.async_runqueue = child;
}
@@ -67,25 +67,22 @@ static void runqueue_remove(struct uwsgi_async_request *u_request) {
static void runqueue_push(struct wsgi_request *wsgi_req) {
struct uwsgi_async_request *uar;
struct uwsgi_async_request *uar = uwsgi_malloc(sizeof(struct uwsgi_async_request));
uar->prev = NULL;
uar->next = NULL;
uar->wsgi_req = wsgi_req;
if (uwsgi.async_runqueue == NULL) {
// empty runqueue, create a new one
uwsgi.async_runqueue = uwsgi_malloc(sizeof(struct uwsgi_async_request));
uwsgi.async_runqueue->next = NULL;
uwsgi.async_runqueue->prev = NULL;
uwsgi.async_runqueue->wsgi_req = wsgi_req;
uwsgi.async_runqueue_last = uwsgi.async_runqueue;
uwsgi.async_runqueue = uar;
}
else {
uar = uwsgi_malloc(sizeof(struct uwsgi_async_request));
uar->prev = uwsgi.async_runqueue_last;
uar->next = NULL;
uar->wsgi_req = wsgi_req;
uwsgi.async_runqueue_last->next = uar;
uwsgi.async_runqueue_last = uar;
uar->prev = uwsgi.async_runqueue_last;
}
if (uwsgi.async_runqueue_last) {
uwsgi.async_runqueue_last->next = uar;
}
uwsgi.async_runqueue_last = uar;
uwsgi.async_runqueue_cnt++;
}
@@ -393,8 +390,6 @@ void async_loop() {
continue;
}
else if (proto_parser_status < 0) {
if (proto_parser_status == -1)
uwsgi_log("error parsing request\n");
uwsgi.async_proto_fd_table[interesting_fd] = NULL;
close(interesting_fd);
continue;
+1 -1
View File
@@ -418,7 +418,7 @@ void uwsgi_reload(char **argv) {
#ifndef UWSGI_IPCSEM_ATEXIT
// free ipc semaphores if in use
if (!strcmp(uwsgi.lock_engine, "ipcsem")) {
if (uwsgi.lock_engine && !strcmp(uwsgi.lock_engine, "ipcsem")) {
uwsgi_ipcsem_clear();
}
#endif
+32 -3
View File
@@ -485,6 +485,28 @@ static int uwsgi_router_goon(struct uwsgi_route *ur, char *arg) {
return 0;
}
// flush response
static int transform_flush(struct wsgi_request *wsgi_req, struct uwsgi_buffer *ub, struct uwsgi_buffer **foobar, void *data) {
wsgi_req->flush = 1;
return uwsgi_response_write_body_do(wsgi_req, ub->buf, ub->pos);
return 0;
}
static int uwsgi_router_flush_func(struct wsgi_request *wsgi_req, struct uwsgi_route *route) {
// if there are no transformations defined, set the flush right now
if (!wsgi_req->transformations) {
wsgi_req->flush = 1;
}
else {
// otherwise push it in the chain
uwsgi_add_transformation(wsgi_req, transform_flush, NULL);
}
return UWSGI_ROUTE_NEXT;
}
static int uwsgi_router_flush(struct uwsgi_route *ur, char *arg) {
ur->func = uwsgi_router_flush_func;
return 0;
}
// log route
static int uwsgi_router_log_func(struct wsgi_request *wsgi_req, struct uwsgi_route *ur) {
@@ -1167,9 +1189,14 @@ static char *uwsgi_route_var_uwsgi(struct wsgi_request *wsgi_req, char *key, uin
}
static char *uwsgi_route_var_mime(struct wsgi_request *wsgi_req, char *key, uint16_t keylen, uint16_t *vallen) {
size_t mime_type_len = 0;
char *ret = uwsgi_get_mime_type(key, keylen, &mime_type_len);
if (ret) *vallen = mime_type_len;
char *ret = NULL;
uint16_t var_vallen = 0;
char *var_value = uwsgi_get_var(wsgi_req, key, keylen, &var_vallen);
if (var_value) {
size_t mime_type_len = 0;
char *ret = uwsgi_get_mime_type(key, keylen, &mime_type_len);
if (ret) *vallen = mime_type_len;
}
return ret;
}
@@ -1271,6 +1298,8 @@ void uwsgi_register_embedded_routers() {
uwsgi_register_router("setprocname", uwsgi_router_setprocname);
uwsgi_register_router("alarm", uwsgi_router_alarm);
uwsgi_register_router("flush", uwsgi_router_flush);
uwsgi_register_route_condition("exists", uwsgi_route_condition_exists);
uwsgi_register_route_condition("isfile", uwsgi_route_condition_isfile);
uwsgi_register_route_condition("isdir", uwsgi_route_condition_isdir);
+4 -2
View File
@@ -581,9 +581,11 @@ void uwsgi_close_request(struct wsgi_request *wsgi_req) {
if (uwsgi_apply_transformations(wsgi_req) == 0) {
// the response_buffer could be changed by translations
ub = wsgi_req->response_buffer;
// force true write
// force true write (take flushing into account)
wsgi_req->response_buffer = NULL;
uwsgi_response_write_body_do(wsgi_req, ub->buf, ub->pos);
if (wsgi_req->response_size == 0) {
uwsgi_response_write_body_do(wsgi_req, ub->buf, ub->pos);
}
}
else {
wsgi_req->write_errors++;
+4 -3
View File
@@ -176,8 +176,8 @@ int uwsgi_response_write_body_do(struct wsgi_request *wsgi_req, char *buf, size_
if (wsgi_req->write_errors) return -1;
// do not commit headers until a response_buffer is available
if (!wsgi_req->response_buffer && !wsgi_req->headers_sent) {
// do not commit headers until a response_buffer is available (take in account flushing)
if ((wsgi_req->flush || !wsgi_req->response_buffer) && !wsgi_req->headers_sent) {
int ret = uwsgi_response_write_headers_do(wsgi_req);
if (ret == UWSGI_OK) goto sendbody;
if (ret == UWSGI_AGAIN) return UWSGI_AGAIN;
@@ -194,7 +194,8 @@ sendbody:
wsgi_req->write_errors++;
return -1;
}
return UWSGI_OK;
if (!wsgi_req->flush)
return UWSGI_OK;
}
for(;;) {
+1 -1
View File
@@ -2,7 +2,7 @@ Gem::Specification.new do |s|
s.name = 'uwsgi'
s.license = 'GPL-2'
s.version = `python -c "import uwsgiconfig as uc; print uc.uwsgi_version"`.sub(/-dev-.*/,'')
s.date = '2013-04-22'
s.date = '2013-04-23'
s.summary = "uWSGI"
s.description = "The uWSGI server for Ruby/Rack"
s.authors = ["Unbit"]
+3
View File
@@ -1416,6 +1416,9 @@ struct wsgi_request {
struct uwsgi_buffer *response_buffer;
struct uwsgi_transformation *transformations;
// if set ignore buffering and directly send the body
int flush;
struct msghdr msg;
union {
struct cmsghdr cmsg;
+1 -1
View File
@@ -1,6 +1,6 @@
# uWSGI build system
uwsgi_version = '1.9.7'
uwsgi_version = '1.9.8'
import os
import re