From 2acd338429f1a727f22637a63c62eea385618c04 Mon Sep 17 00:00:00 2001 From: Unbit Date: Fri, 25 Jan 2013 17:38:42 +0100 Subject: [PATCH] SPDY improvements --- plugins/http/common.h | 1 + plugins/http/http.c | 7 +++++++ plugins/http/https.c | 3 +++ plugins/http/spdy3.c | 46 ++++++++++++++++++++++++++++++------------- 4 files changed, 43 insertions(+), 14 deletions(-) diff --git a/plugins/http/common.h b/plugins/http/common.h index 0efd54ee..9cfa31a2 100644 --- a/plugins/http/common.h +++ b/plugins/http/common.h @@ -170,6 +170,7 @@ ssize_t spdy_parse(struct corerouter_peer *); ssize_t hs_http_manage(struct corerouter_peer *, ssize_t); ssize_t hr_instance_connected(struct corerouter_peer *); +ssize_t hr_instance_write(struct corerouter_peer *); ssize_t hr_instance_read_response(struct corerouter_peer *); ssize_t hr_read_body(struct corerouter_peer *); diff --git a/plugins/http/http.c b/plugins/http/http.c index ad3961ec..cfe1a59e 100644 --- a/plugins/http/http.c +++ b/plugins/http/http.c @@ -360,6 +360,13 @@ ssize_t hr_instance_write(struct corerouter_peer *peer) { peer->out->pos = 0; } cr_reset_hooks(peer); +#ifdef UWSGI_SPDY + struct http_session *hr = (struct http_session *) peer->session; + if (hr->spdy) { + return spdy_parse(peer->session->main_peer); + } +#endif + } return len; diff --git a/plugins/http/https.c b/plugins/http/https.c index 6c817217..9f984275 100644 --- a/plugins/http/https.c +++ b/plugins/http/https.c @@ -311,12 +311,15 @@ ssize_t hr_ssl_read(struct corerouter_peer *main_peer) { // try to always leave 4k available if (uwsgi_buffer_ensure(main_peer->in, uwsgi.page_size)) return -1; + uwsgi_log("REMAINS: %llu\n", (unsigned long long) main_peer->in->len - main_peer->in->pos); int ret = SSL_read(hr->ssl, main_peer->in->buf + main_peer->in->pos, main_peer->in->len - main_peer->in->pos); + uwsgi_log("ret = %d\n", ret); if (ret > 0) { // fix the buffer main_peer->in->pos += ret; // check for pending data int ret2 = SSL_pending(hr->ssl); + uwsgi_log("ret2 = %d\n", ret2); if (ret2 > 0) { if (uwsgi_buffer_fix(main_peer->in, main_peer->in->len + ret2 )) { uwsgi_log("[uwsgi-https] cannot fix the buffer to %d\n", main_peer->in->len + ret2); diff --git a/plugins/http/spdy3.c b/plugins/http/spdy3.c index 1f2100a1..aa7f124f 100644 --- a/plugins/http/spdy3.c +++ b/plugins/http/spdy3.c @@ -492,6 +492,14 @@ static ssize_t spdy_inflate_http_headers(struct http_session *hr) { return -1; } + uint16_t pktsize = new_peer->out->pos-4; + // fix modifiers + new_peer->out->buf[0] = new_peer->session->main_peer->modifier1; + new_peer->out->buf[3] = new_peer->session->main_peer->modifier2; + // fix pktsize + new_peer->out->buf[1] = (uint8_t) (pktsize & 0xff); + new_peer->out->buf[2] = (uint8_t) ((pktsize >> 8) & 0xff); + cr_connect(new_peer, hr_instance_connected); return 1; @@ -588,12 +596,11 @@ ssize_t spdy_parse(struct corerouter_peer *main_peer) { return 1; } - for(;;) { size_t len = main_peer->in->pos; + uwsgi_log("available %llu bytes\n", (unsigned long long) len); if (len == 0) { - errno = EINPROGRESS; - return -1; + return 1; } uint8_t *buf = (uint8_t *) main_peer->in->buf; //uwsgi_log("%d bytes available\n", len); @@ -608,18 +615,19 @@ ssize_t spdy_parse(struct corerouter_peer *main_peer) { hr->spdy_control_length = spdy_h_read_length(buf); hr->spdy_phase = UWSGI_SPDY_PHASE_CONTROL; hr->spdy_need = hr->spdy_control_length; - //uwsgi_log("now i need %d bytes for type %u\n", hr->spdy_need, hr->spdy_control_type); + //uwsgi_log("now i need %llu bytes for type %u\n", (unsigned long long) hr->spdy_need, hr->spdy_control_type); } else { - uwsgi_log("OOOOPS\n"); hr->spdy_phase = UWSGI_SPDY_PHASE_DATA; - hr->spdy_need = 1; + hr->spdy_data_stream_id = spdy_stream_id(buf); + hr->spdy_control_length = spdy_h_read_length(buf); + hr->spdy_need = hr->spdy_control_length; + uwsgi_log("need %llu bytes for stream_id %lu\n", (unsigned long long) hr->spdy_need, hr->spdy_data_stream_id); } if (uwsgi_buffer_decapitate(main_peer->in, 8)) return -1; continue; } - errno = EINPROGRESS; - return -1; + return 1; case UWSGI_SPDY_PHASE_CONTROL: if (len >= hr->spdy_need) { switch(hr->spdy_control_type) { @@ -627,11 +635,13 @@ ssize_t spdy_parse(struct corerouter_peer *main_peer) { case 1: ret = spdy_manage_syn_stream(hr); if (ret == 0) goto goon; + if (ret < 0) return -1; goto newframe; // RST_STREAM case 3: ret = spdy_manage_rst_stream(hr); if (ret == 0) goto goon; + if (ret < 0) return -1; goto newframe; case 4: //uwsgi_log("settings request...\n"); @@ -639,6 +649,7 @@ ssize_t spdy_parse(struct corerouter_peer *main_peer) { case 6: ret = spdy_manage_ping(hr); if (ret == 0) goto goon; + if (ret < 0) return -1; goto newframe; break; default: @@ -651,15 +662,22 @@ goon: if (uwsgi_buffer_decapitate(main_peer->in, hr->spdy_control_length)) return -1; continue; } - errno = EINPROGRESS; - return -1; + return 1; case UWSGI_SPDY_PHASE_DATA: if (len >= hr->spdy_need) { - //peer = find_stream_id(); - //cr_write_to_backend(peer, spdy_data); + struct corerouter_peer *peer = uwsgi_cr_peer_find_by_sid(&hr->session, hr->spdy_data_stream_id); + if (!peer) { + return -1; + } + + peer->out->pos = 0; + if (uwsgi_buffer_append(peer->out, main_peer->in->buf, hr->spdy_need)) return -1; + peer->out_pos = 0; + cr_write_to_backend(peer, hr_instance_write); + ret = 1; + goto newframe; } - errno = EINPROGRESS; - return -1; + return 1; default: return -1; }