asio-lib: Remove validation offered by nghttp2 lib

This commit is contained in:
Tatsuhiro Tsujikawa 2015-02-21 00:06:05 +09:00
parent 9302e3edf4
commit 7897f5b94b
1 changed files with 13 additions and 48 deletions

View File

@ -336,54 +336,25 @@ int on_header_callback(nghttp2_session *session, const nghttp2_frame *frame,
return 0;
}
if (!nghttp2_check_header_name(name, namelen) ||
!nghttp2_check_header_value(value, valuelen)) {
stream_error(session, stream_id, NGHTTP2_PROTOCOL_ERROR);
return NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE;
}
auto &req = stream->get_request()->impl();
if (name[0] == ':' && !req.headers().empty()) {
stream_error(session, stream_id, NGHTTP2_PROTOCOL_ERROR);
return NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE;
}
if (util::streq_l(":method", name, namelen)) {
if (!req.method().empty()) {
stream_error(session, stream_id, NGHTTP2_PROTOCOL_ERROR);
return NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE;
}
switch (nghttp2::http2::lookup_token(name, namelen)) {
case nghttp2::http2::HD__METHOD:
req.method(std::string(value, value + valuelen));
} else if (util::streq_l(":scheme", name, namelen)) {
if (!req.scheme().empty()) {
stream_error(session, stream_id, NGHTTP2_PROTOCOL_ERROR);
return NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE;
}
break;
case nghttp2::http2::HD__SCHEME:
req.scheme(std::string(value, value + valuelen));
} else if (util::streq_l(":authority", name, namelen)) {
if (!req.authority().empty()) {
stream_error(session, stream_id, NGHTTP2_PROTOCOL_ERROR);
return NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE;
}
break;
case nghttp2::http2::HD__AUTHORITY:
req.authority(std::string(value, value + valuelen));
} else if (util::streq_l(":path", name, namelen)) {
if (!req.path().empty()) {
stream_error(session, stream_id, NGHTTP2_PROTOCOL_ERROR);
return NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE;
}
break;
case nghttp2::http2::HD__PATH:
req.path(std::string(value, value + valuelen));
} else {
if (name[0] == ':') {
stream_error(session, stream_id, NGHTTP2_PROTOCOL_ERROR);
return NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE;
}
if (util::streq_l("host", name, namelen)) {
req.host(std::string(value, value + valuelen));
}
break;
case nghttp2::http2::HD_HOST:
req.host(std::string(value, value + valuelen));
// fall through
default:
req.add_header(std::string(name, name + namelen),
std::string(value, value + valuelen));
}
@ -416,12 +387,6 @@ int on_frame_recv_callback(nghttp2_session *session, const nghttp2_frame *frame,
auto &req = stream->get_request()->impl();
if (req.method().empty() || req.scheme().empty() || req.path().empty() ||
(req.authority().empty() && req.host().empty())) {
stream_error(session, frame->hd.stream_id, NGHTTP2_PROTOCOL_ERROR);
return 0;
}
if (req.host().empty()) {
req.host(req.authority());
}