Translate received SPDY/2 name/value pairs into SPDY/3 style.

The callback functions receives SPDY/3 style name/value pairs.
This commit is contained in:
Tatsuhiro Tsujikawa 2012-03-07 00:42:47 +09:00
parent 00abfc8dd3
commit 185d929d86
4 changed files with 25 additions and 46 deletions

View File

@ -266,8 +266,8 @@ int SpdyEventHandler::submit_file_response(const std::string& status,
std::string date_str = util::http_date(time(0)); std::string date_str = util::http_date(time(0));
std::string content_length = util::to_str(file_length); std::string content_length = util::to_str(file_length);
const char *nv[] = { const char *nv[] = {
get_header_field(version_, HD_STATUS).c_str(), status.c_str(), ":status", status.c_str(),
get_header_field(version_, HD_VERSION).c_str(), "HTTP/1.1", ":version", "HTTP/1.1",
"server", SPDYD_SERVER.c_str(), "server", SPDYD_SERVER.c_str(),
"content-length", content_length.c_str(), "content-length", content_length.c_str(),
"cache-control", "max-age=3600", "cache-control", "max-age=3600",
@ -290,9 +290,9 @@ int SpdyEventHandler::submit_response
{ {
std::string date_str = util::http_date(time(0)); std::string date_str = util::http_date(time(0));
const char **nv = new const char*[8+headers.size()*2+1]; const char **nv = new const char*[8+headers.size()*2+1];
nv[0] = get_header_field(version_, HD_STATUS).c_str(); nv[0] = ":status";
nv[1] = status.c_str(); nv[1] = status.c_str();
nv[2] = get_header_field(version_, HD_VERSION).c_str(); nv[2] = ":version";
nv[3] = "HTTP/1.1"; nv[3] = "HTTP/1.1";
nv[4] = "server"; nv[4] = "server";
nv[5] = SPDYD_SERVER.c_str(); nv[5] = SPDYD_SERVER.c_str();
@ -313,8 +313,8 @@ int SpdyEventHandler::submit_response(const std::string& status,
spdylay_data_provider *data_prd) spdylay_data_provider *data_prd)
{ {
const char *nv[] = { const char *nv[] = {
get_header_field(version_, HD_STATUS).c_str(), status.c_str(), ":status", status.c_str(),
get_header_field(version_, HD_VERSION).c_str(), "HTTP/1.1", ":version", "HTTP/1.1",
"server", SPDYD_SERVER.c_str(), "server", SPDYD_SERVER.c_str(),
0 0
}; };
@ -452,16 +452,16 @@ void prepare_response(Request *req, SpdyEventHandler *hd)
for(int i = 0; i < (int)req->headers.size(); ++i) { for(int i = 0; i < (int)req->headers.size(); ++i) {
const std::string &field = req->headers[i].first; const std::string &field = req->headers[i].first;
const std::string &value = req->headers[i].second; const std::string &value = req->headers[i].second;
if(!url_found && field == get_header_field(hd->version(), HD_PATH)) { if(!url_found && field == ":path") {
url_found = true; url_found = true;
url = value; url = value;
} else if(field == get_header_field(hd->version(), HD_METHOD)) { } else if(field == ":method") {
method_found = true; method_found = true;
} else if(field == get_header_field(hd->version(), HD_SCHEME)) { } else if(field == ":scheme") {
scheme_found = true; scheme_found = true;
} else if(field == get_header_field(hd->version(), HD_VERSION)) { } else if(field == ":version") {
version_found = true; version_found = true;
} else if(field == get_header_field(hd->version(), HD_HOST)) { } else if(field == ":host") {
host_found = true; host_found = true;
} else if(!last_mod_found && field == "if-modified-since") { } else if(!last_mod_found && field == "if-modified-since") {
last_mod_found = true; last_mod_found = true;

View File

@ -48,17 +48,6 @@ namespace spdylay {
bool ssl_debug = false; bool ssl_debug = false;
const std::string& get_header_field(uint16_t version, size_t field)
{
if(version == SPDYLAY_PROTO_SPDY2) {
return header_fields_spdy2[field];
} else if(version == SPDYLAY_PROTO_SPDY3) {
return header_fields_spdy3[field];
} else {
abort();
}
}
Spdylay::Spdylay(int fd, SSL *ssl, uint16_t version, Spdylay::Spdylay(int fd, SSL *ssl, uint16_t version,
const spdylay_session_callbacks *callbacks) const spdylay_session_callbacks *callbacks)
: fd_(fd), ssl_(ssl), version_(version), want_write_(false) : fd_(fd), ssl_(ssl), version_(version), want_write_(false)
@ -122,11 +111,11 @@ int Spdylay::submit_request(const std::string& hostport,
void *stream_user_data) void *stream_user_data)
{ {
const char *nv[] = { const char *nv[] = {
get_header_field(version_, HD_METHOD).c_str(), "GET", ":method", "GET",
get_header_field(version_, HD_PATH).c_str(), path.c_str(), ":path", path.c_str(),
get_header_field(version_, HD_VERSION).c_str(), "HTTP/1.1", ":version", "HTTP/1.1",
get_header_field(version_, HD_SCHEME).c_str(), "https", ":scheme", "https",
get_header_field(version_, HD_HOST).c_str(), hostport.c_str(), ":host", hostport.c_str(),
"user-agent", "spdylay/0.0.0", "user-agent", "spdylay/0.0.0",
NULL NULL
}; };

View File

@ -38,25 +38,6 @@ namespace spdylay {
extern bool ssl_debug; extern bool ssl_debug;
enum HeaderField {
HD_METHOD = 0,
HD_PATH = 1,
HD_VERSION = 2,
HD_HOST = 3,
HD_SCHEME = 4,
HD_STATUS = 5
};
const std::string header_fields_spdy2[] = {
"method", "url", "version", "host", "scheme", "status", "version"
};
const std::string header_fields_spdy3[] = {
":method", ":path", ":version", ":host", ":scheme", ":status", ":version"
};
const std::string& get_header_field(uint16_t version, size_t field);
class Spdylay { class Spdylay {
public: public:
Spdylay(int fd, SSL *ssl, uint16_t version, Spdylay(int fd, SSL *ssl, uint16_t version,

View File

@ -1539,6 +1539,9 @@ static int spdylay_session_process_ctrl_frame(spdylay_session *session)
session->iframe.len, session->iframe.len,
&session->hd_inflater); &session->hd_inflater);
if(r == 0) { if(r == 0) {
if(session->version == SPDYLAY_PROTO_SPDY2) {
spdylay_frame_nv_2to3(frame.syn_stream.nv);
}
r = spdylay_session_on_syn_stream_received(session, &frame); r = spdylay_session_on_syn_stream_received(session, &frame);
spdylay_frame_syn_stream_free(&frame.syn_stream); spdylay_frame_syn_stream_free(&frame.syn_stream);
/* TODO if r indicates mulformed NV pairs (multiple nulls) or /* TODO if r indicates mulformed NV pairs (multiple nulls) or
@ -1560,6 +1563,9 @@ static int spdylay_session_process_ctrl_frame(spdylay_session *session)
session->iframe.len, session->iframe.len,
&session->hd_inflater); &session->hd_inflater);
if(r == 0) { if(r == 0) {
if(session->version == SPDYLAY_PROTO_SPDY2) {
spdylay_frame_nv_2to3(frame.syn_reply.nv);
}
r = spdylay_session_on_syn_reply_received(session, &frame); r = spdylay_session_on_syn_reply_received(session, &frame);
spdylay_frame_syn_reply_free(&frame.syn_reply); spdylay_frame_syn_reply_free(&frame.syn_reply);
} else if(spdylay_is_non_fatal(r)) { } else if(spdylay_is_non_fatal(r)) {
@ -1632,6 +1638,9 @@ static int spdylay_session_process_ctrl_frame(spdylay_session *session)
session->iframe.len, session->iframe.len,
&session->hd_inflater); &session->hd_inflater);
if(r == 0) { if(r == 0) {
if(session->version == SPDYLAY_PROTO_SPDY2) {
spdylay_frame_nv_2to3(frame.headers.nv);
}
r = spdylay_session_on_headers_received(session, &frame); r = spdylay_session_on_headers_received(session, &frame);
spdylay_frame_headers_free(&frame.headers); spdylay_frame_headers_free(&frame.headers);
} else if(spdylay_is_non_fatal(r)) { } else if(spdylay_is_non_fatal(r)) {