mirror of
https://github.com/clearlinux/uwsgi.git
synced 2026-09-06 13:41:28 +00:00
fixed a https/corerouter corner-case bug
This commit is contained in:
@@ -833,9 +833,21 @@ void uwsgi_corerouter_loop(int id, void *data) {
|
||||
}
|
||||
}
|
||||
|
||||
// not having a hook could mean a previous event in the loop cleared it...
|
||||
if (!hook) {
|
||||
uwsgi_log("[uwsgi-corerouter] BUG, unexpected event received !!!\n");
|
||||
corerouter_close_session(ucr, cr_session);
|
||||
// a single event cannot be unexpected..
|
||||
if (nevents == 1) {
|
||||
if (interesting_fd == cr_session->instance_fd) {
|
||||
uwsgi_log("[uwsgi-corerouter] BUG, unexpected event received from backend instance (fd: %d nevents: %d) !!!\n", interesting_fd, nevents);
|
||||
}
|
||||
else if (interesting_fd == cr_session->fd) {
|
||||
uwsgi_log("[uwsgi-corerouter] BUG, unexpected event received from client (fd: %d nevents: %d)!!!\n", interesting_fd, nevents);
|
||||
}
|
||||
else {
|
||||
uwsgi_log("[uwsgi-corerouter] BUG, unexpected event received !!!\n");
|
||||
}
|
||||
corerouter_close_session(ucr, cr_session);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@@ -330,6 +330,10 @@ void uwsgi_gevent_nb_write(struct wsgi_request *wsgi_req, PyObject *str) {
|
||||
PyObject *ret;
|
||||
char *content = PyString_AsString(str);
|
||||
size_t content_len = PyString_Size(str);
|
||||
|
||||
// do not try to write empty chunks
|
||||
if (content_len == 0) return;
|
||||
|
||||
/// create a watcher for writes
|
||||
PyObject *watcher = PyObject_CallMethod(ugevent.hub_loop, "io", "ii", wsgi_req->poll.fd, 2);
|
||||
if (!watcher) goto error;
|
||||
|
||||
@@ -526,10 +526,6 @@ ssize_t hr_read_ssl_body(struct corerouter_session * cs) {
|
||||
struct http_session *hs = (struct http_session *) cs;
|
||||
int ret = SSL_read(hs->ssl, hs->post_buf->buf, hs->post_buf_max);
|
||||
if (ret > 0) {
|
||||
// fix waiting
|
||||
if (cs->event_hook_write) {
|
||||
uwsgi_cr_hook_write(cs, NULL);
|
||||
}
|
||||
int ret2 = SSL_pending(hs->ssl);
|
||||
if (ret2 > 0) {
|
||||
if (uwsgi_buffer_fix(hs->post_buf, hs->post_buf->len + ret2 )) {
|
||||
@@ -615,9 +611,6 @@ ssize_t hr_write_ssl_response(struct corerouter_session * cs) {
|
||||
|
||||
if (ret > 0) {
|
||||
cs->buffer_pos += ret;
|
||||
if (cs->event_hook_read) {
|
||||
uwsgi_cr_hook_read(cs, NULL);
|
||||
}
|
||||
// could be a partial write
|
||||
uwsgi_cr_hook_write(cs, hr_write_ssl_response);
|
||||
// ok this response chunk is sent, let's wait for another one
|
||||
@@ -838,9 +831,6 @@ ssize_t hr_send_expect_continue(struct corerouter_session * cs) {
|
||||
if (ret > 0) {
|
||||
len = ret;
|
||||
cs->buffer_pos += ret;
|
||||
if (cs->event_hook_read) {
|
||||
uwsgi_cr_hook_read(cs, NULL);
|
||||
}
|
||||
// could be a partial write
|
||||
uwsgi_cr_hook_write(cs, hr_send_expect_continue);
|
||||
goto done;
|
||||
@@ -939,11 +929,6 @@ ssize_t hr_recv_http_ssl(struct corerouter_session * cs) {
|
||||
struct http_session *hs = (struct http_session *) cs;
|
||||
int ret = SSL_read(hs->ssl, cs->buffer->buf + cs->buffer_pos, cs->buffer->len - cs->buffer_pos);
|
||||
if (ret > 0) {
|
||||
// fix waiting
|
||||
if (cs->event_hook_write) {
|
||||
uwsgi_cr_hook_write(cs, NULL);
|
||||
uwsgi_cr_hook_read(cs, hr_recv_http_ssl);
|
||||
}
|
||||
int ret2 = SSL_pending(hs->ssl);
|
||||
if (ret2 > 0) {
|
||||
if (uwsgi_buffer_fix(cs->buffer, cs->buffer->len + ret2 )) {
|
||||
|
||||
Reference in New Issue
Block a user