Append Via header field. Don't modify Server header field.
This commit is contained in:
parent
908ec2e695
commit
e37ec7b765
|
@ -30,6 +30,7 @@
|
||||||
#include "shrpx_client_handler.h"
|
#include "shrpx_client_handler.h"
|
||||||
#include "shrpx_config.h"
|
#include "shrpx_config.h"
|
||||||
#include "shrpx_error.h"
|
#include "shrpx_error.h"
|
||||||
|
#include "shrpx_http.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
using namespace spdylay;
|
using namespace spdylay;
|
||||||
|
@ -43,10 +44,14 @@ Downstream::Downstream(Upstream *upstream, int stream_id, int priority)
|
||||||
priority_(priority),
|
priority_(priority),
|
||||||
ioctrl_(0),
|
ioctrl_(0),
|
||||||
request_state_(INITIAL),
|
request_state_(INITIAL),
|
||||||
|
request_major_(1),
|
||||||
|
request_minor_(1),
|
||||||
chunked_request_(false),
|
chunked_request_(false),
|
||||||
request_connection_close_(false),
|
request_connection_close_(false),
|
||||||
response_state_(INITIAL),
|
response_state_(INITIAL),
|
||||||
response_http_status_(0),
|
response_http_status_(0),
|
||||||
|
response_major_(1),
|
||||||
|
response_minor_(1),
|
||||||
chunked_response_(false),
|
chunked_response_(false),
|
||||||
response_htp_(htparser_new()),
|
response_htp_(htparser_new()),
|
||||||
response_body_buf_(0)
|
response_body_buf_(0)
|
||||||
|
@ -140,6 +145,16 @@ void Downstream::set_request_path(const std::string& path)
|
||||||
request_path_ = path;
|
request_path_ = path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Downstream::set_request_major(int major)
|
||||||
|
{
|
||||||
|
request_major_ = major;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Downstream::set_request_minor(int minor)
|
||||||
|
{
|
||||||
|
request_minor_ = minor;
|
||||||
|
}
|
||||||
|
|
||||||
Upstream* Downstream::get_upstream() const
|
Upstream* Downstream::get_upstream() const
|
||||||
{
|
{
|
||||||
return upstream_;
|
return upstream_;
|
||||||
|
@ -208,11 +223,16 @@ int Downstream::push_request_headers()
|
||||||
hdrs += "Host: ";
|
hdrs += "Host: ";
|
||||||
hdrs += get_config()->downstream_hostport;
|
hdrs += get_config()->downstream_hostport;
|
||||||
hdrs += "\r\n";
|
hdrs += "\r\n";
|
||||||
|
std::string via_value;
|
||||||
for(Headers::const_iterator i = request_headers_.begin();
|
for(Headers::const_iterator i = request_headers_.begin();
|
||||||
i != request_headers_.end(); ++i) {
|
i != request_headers_.end(); ++i) {
|
||||||
if(util::strieq((*i).first.c_str(), "X-Forwarded-Proto")) {
|
if(util::strieq((*i).first.c_str(), "X-Forwarded-Proto")) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if(util::strieq((*i).first.c_str(), "via")) {
|
||||||
|
via_value = (*i).second;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
hdrs += (*i).first;
|
hdrs += (*i).first;
|
||||||
hdrs += ": ";
|
hdrs += ": ";
|
||||||
hdrs += (*i).second;
|
hdrs += (*i).second;
|
||||||
|
@ -231,6 +251,14 @@ int Downstream::push_request_headers()
|
||||||
}
|
}
|
||||||
hdrs += "X-Forwarded-Proto: https\r\n";
|
hdrs += "X-Forwarded-Proto: https\r\n";
|
||||||
|
|
||||||
|
hdrs += "Via: ";
|
||||||
|
hdrs += via_value;
|
||||||
|
if(!via_value.empty()) {
|
||||||
|
hdrs += ", ";
|
||||||
|
}
|
||||||
|
hdrs += http::create_via_header_value(request_major_, request_minor_);
|
||||||
|
hdrs += "\r\n";
|
||||||
|
|
||||||
hdrs += "\r\n";
|
hdrs += "\r\n";
|
||||||
if(ENABLE_LOG) {
|
if(ENABLE_LOG) {
|
||||||
LOG(INFO) << "Downstream request headers\n" << hdrs;
|
LOG(INFO) << "Downstream request headers\n" << hdrs;
|
||||||
|
@ -299,6 +327,26 @@ void Downstream::set_response_http_status(unsigned int status)
|
||||||
response_http_status_ = status;
|
response_http_status_ = status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Downstream::set_response_major(int major)
|
||||||
|
{
|
||||||
|
response_major_ = major;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Downstream::set_response_minor(int minor)
|
||||||
|
{
|
||||||
|
response_minor_ = minor;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Downstream::get_response_major() const
|
||||||
|
{
|
||||||
|
return response_major_;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Downstream::get_response_minor() const
|
||||||
|
{
|
||||||
|
return response_minor_;
|
||||||
|
}
|
||||||
|
|
||||||
bool Downstream::get_chunked_response() const
|
bool Downstream::get_chunked_response() const
|
||||||
{
|
{
|
||||||
return chunked_response_;
|
return chunked_response_;
|
||||||
|
@ -310,6 +358,8 @@ int htp_hdrs_completecb(htparser *htp)
|
||||||
Downstream *downstream;
|
Downstream *downstream;
|
||||||
downstream = reinterpret_cast<Downstream*>(htparser_get_userdata(htp));
|
downstream = reinterpret_cast<Downstream*>(htparser_get_userdata(htp));
|
||||||
downstream->set_response_http_status(htparser_get_status(htp));
|
downstream->set_response_http_status(htparser_get_status(htp));
|
||||||
|
downstream->set_response_major(htparser_get_major(htp));
|
||||||
|
downstream->set_response_minor(htparser_get_minor(htp));
|
||||||
downstream->set_response_state(Downstream::HEADER_COMPLETE);
|
downstream->set_response_state(Downstream::HEADER_COMPLETE);
|
||||||
downstream->get_upstream()->on_downstream_header_complete(downstream);
|
downstream->get_upstream()->on_downstream_header_complete(downstream);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -63,6 +63,8 @@ public:
|
||||||
void set_last_request_header_value(const std::string& value);
|
void set_last_request_header_value(const std::string& value);
|
||||||
void set_request_method(const std::string& method);
|
void set_request_method(const std::string& method);
|
||||||
void set_request_path(const std::string& path);
|
void set_request_path(const std::string& path);
|
||||||
|
void set_request_major(int major);
|
||||||
|
void set_request_minor(int minor);
|
||||||
int push_request_headers();
|
int push_request_headers();
|
||||||
bool get_chunked_request() const;
|
bool get_chunked_request() const;
|
||||||
bool get_request_connection_close() const;
|
bool get_request_connection_close() const;
|
||||||
|
@ -84,6 +86,10 @@ public:
|
||||||
void set_last_response_header_value(const std::string& value);
|
void set_last_response_header_value(const std::string& value);
|
||||||
unsigned int get_response_http_status() const;
|
unsigned int get_response_http_status() const;
|
||||||
void set_response_http_status(unsigned int status);
|
void set_response_http_status(unsigned int status);
|
||||||
|
void set_response_major(int major);
|
||||||
|
void set_response_minor(int minor);
|
||||||
|
int get_response_major() const;
|
||||||
|
int get_response_minor() const;
|
||||||
bool get_chunked_response() const;
|
bool get_chunked_response() const;
|
||||||
int parse_http_response();
|
int parse_http_response();
|
||||||
void set_response_state(int state);
|
void set_response_state(int state);
|
||||||
|
@ -99,12 +105,16 @@ private:
|
||||||
int request_state_;
|
int request_state_;
|
||||||
std::string request_method_;
|
std::string request_method_;
|
||||||
std::string request_path_;
|
std::string request_path_;
|
||||||
|
int request_major_;
|
||||||
|
int request_minor_;
|
||||||
bool chunked_request_;
|
bool chunked_request_;
|
||||||
bool request_connection_close_;
|
bool request_connection_close_;
|
||||||
Headers request_headers_;
|
Headers request_headers_;
|
||||||
|
|
||||||
int response_state_;
|
int response_state_;
|
||||||
unsigned int response_http_status_;
|
unsigned int response_http_status_;
|
||||||
|
int response_major_;
|
||||||
|
int response_minor_;
|
||||||
bool chunked_response_;
|
bool chunked_response_;
|
||||||
Headers response_headers_;
|
Headers response_headers_;
|
||||||
htparser *response_htp_;
|
htparser *response_htp_;
|
||||||
|
|
|
@ -93,6 +93,16 @@ std::string create_error_html(int status_code)
|
||||||
return ss.str();
|
return ss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string create_via_header_value(int major, int minor)
|
||||||
|
{
|
||||||
|
std::string hdrs;
|
||||||
|
hdrs += static_cast<char>(major+'0');
|
||||||
|
hdrs += ".";
|
||||||
|
hdrs += static_cast<char>(minor+'0');
|
||||||
|
hdrs += " shrpx";
|
||||||
|
return hdrs;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace http
|
} // namespace http
|
||||||
|
|
||||||
} // namespace shrpx
|
} // namespace shrpx
|
||||||
|
|
|
@ -35,6 +35,8 @@ const char* get_status_string(int status_code);
|
||||||
|
|
||||||
std::string create_error_html(int status_code);
|
std::string create_error_html(int status_code);
|
||||||
|
|
||||||
|
std::string create_via_header_value(int major, int minor);
|
||||||
|
|
||||||
} // namespace http
|
} // namespace http
|
||||||
|
|
||||||
} // namespace shrpx
|
} // namespace shrpx
|
||||||
|
|
|
@ -154,6 +154,9 @@ int htp_hdrs_completecb(htparser *htp)
|
||||||
upstream = reinterpret_cast<HttpsUpstream*>(htparser_get_userdata(htp));
|
upstream = reinterpret_cast<HttpsUpstream*>(htparser_get_userdata(htp));
|
||||||
Downstream *downstream = upstream->get_last_downstream();
|
Downstream *downstream = upstream->get_last_downstream();
|
||||||
|
|
||||||
|
downstream->set_request_major(htparser_get_major(htp));
|
||||||
|
downstream->set_request_minor(htparser_get_minor(htp));
|
||||||
|
|
||||||
downstream->push_request_headers();
|
downstream->push_request_headers();
|
||||||
downstream->set_request_state(Downstream::HEADER_COMPLETE);
|
downstream->set_request_state(Downstream::HEADER_COMPLETE);
|
||||||
|
|
||||||
|
@ -452,6 +455,7 @@ int HttpsUpstream::on_downstream_header_complete(Downstream *downstream)
|
||||||
if(ENABLE_LOG) {
|
if(ENABLE_LOG) {
|
||||||
LOG(INFO) << "Downstream on_downstream_header_complete";
|
LOG(INFO) << "Downstream on_downstream_header_complete";
|
||||||
}
|
}
|
||||||
|
std::string via_value;
|
||||||
std::string hdrs = "HTTP/1.1 ";
|
std::string hdrs = "HTTP/1.1 ";
|
||||||
hdrs += http::get_status_string(downstream->get_response_http_status());
|
hdrs += http::get_status_string(downstream->get_response_http_status());
|
||||||
hdrs += "\r\n";
|
hdrs += "\r\n";
|
||||||
|
@ -461,21 +465,26 @@ int HttpsUpstream::on_downstream_header_complete(Downstream *downstream)
|
||||||
util::strieq((*i).first.c_str(), "connection") ||
|
util::strieq((*i).first.c_str(), "connection") ||
|
||||||
util:: strieq((*i).first.c_str(), "proxy-connection")) {
|
util:: strieq((*i).first.c_str(), "proxy-connection")) {
|
||||||
// These are ignored
|
// These are ignored
|
||||||
|
} else if(util::strieq((*i).first.c_str(), "via")) {
|
||||||
|
via_value = (*i).second;
|
||||||
} else {
|
} else {
|
||||||
if(util::strieq((*i).first.c_str(), "server")) {
|
hdrs += (*i).first;
|
||||||
hdrs += "Server: ";
|
hdrs += ": ";
|
||||||
hdrs += get_config()->server_name;
|
hdrs += (*i).second;
|
||||||
} else {
|
|
||||||
hdrs += (*i).first;
|
|
||||||
hdrs += ": ";
|
|
||||||
hdrs += (*i).second;
|
|
||||||
}
|
|
||||||
hdrs += "\r\n";
|
hdrs += "\r\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(get_client_handler()->get_should_close_after_write()) {
|
if(get_client_handler()->get_should_close_after_write()) {
|
||||||
hdrs += "Connection: close\r\n";
|
hdrs += "Connection: close\r\n";
|
||||||
}
|
}
|
||||||
|
hdrs += "Via: ";
|
||||||
|
hdrs += via_value;
|
||||||
|
if(!via_value.empty()) {
|
||||||
|
hdrs += ", ";
|
||||||
|
}
|
||||||
|
hdrs += http::create_via_header_value
|
||||||
|
(downstream->get_response_major(), downstream->get_response_minor());
|
||||||
|
hdrs += "\r\n";
|
||||||
hdrs += "\r\n";
|
hdrs += "\r\n";
|
||||||
if(ENABLE_LOG) {
|
if(ENABLE_LOG) {
|
||||||
LOG(INFO) << "Upstream https response headers\n" << hdrs;
|
LOG(INFO) << "Upstream https response headers\n" << hdrs;
|
||||||
|
|
|
@ -499,9 +499,6 @@ int SpdyUpstream::on_downstream_header_complete(Downstream *downstream)
|
||||||
util::strieq((*i).first.c_str(), "connection") ||
|
util::strieq((*i).first.c_str(), "connection") ||
|
||||||
util:: strieq((*i).first.c_str(), "proxy-connection")) {
|
util:: strieq((*i).first.c_str(), "proxy-connection")) {
|
||||||
// These are ignored
|
// These are ignored
|
||||||
} else if(util::strieq((*i).first.c_str(), "server")) {
|
|
||||||
nv[hdidx++] = "server";
|
|
||||||
nv[hdidx++] = get_config()->server_name;
|
|
||||||
} else {
|
} else {
|
||||||
nv[hdidx++] = (*i).first.c_str();
|
nv[hdidx++] = (*i).first.c_str();
|
||||||
nv[hdidx++] = (*i).second.c_str();
|
nv[hdidx++] = (*i).second.c_str();
|
||||||
|
|
Loading…
Reference in New Issue