nghttpx: Return error when downstream HTTP/1 connection attempt failed
This commit is contained in:
parent
ca7288ae38
commit
b9f41e34ef
|
@ -69,6 +69,25 @@ func TestH1H1MultipleRequestCL(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestH1H1ConnectFailure(t *testing.T) {
|
||||||
|
st := newServerTester(nil, t, noopHandler)
|
||||||
|
defer st.Close()
|
||||||
|
|
||||||
|
// shutdown backend server to simulate backend connect failure
|
||||||
|
st.ts.Close()
|
||||||
|
|
||||||
|
res, err := st.http1(requestParam{
|
||||||
|
name: "TestH1H1ConnectFailure",
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Error st.http2() = %v", err)
|
||||||
|
}
|
||||||
|
want := 502
|
||||||
|
if got := res.status; got != want {
|
||||||
|
t.Errorf("status: %v; want %v", got, want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestH2H1PlainGET(t *testing.T) {
|
func TestH2H1PlainGET(t *testing.T) {
|
||||||
st := newServerTester(nil, t, noopHandler)
|
st := newServerTester(nil, t, noopHandler)
|
||||||
defer st.Close()
|
defer st.Close()
|
||||||
|
@ -305,6 +324,25 @@ func TestH2H1InvalidRequestCL(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestH2H1ConnectFailure(t *testing.T) {
|
||||||
|
st := newServerTester(nil, t, noopHandler)
|
||||||
|
defer st.Close()
|
||||||
|
|
||||||
|
// shutdown backend server to simulate backend connect failure
|
||||||
|
st.ts.Close()
|
||||||
|
|
||||||
|
res, err := st.http2(requestParam{
|
||||||
|
name: "TestH2H1ConnectFailure",
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Error st.http2() = %v", err)
|
||||||
|
}
|
||||||
|
want := 502
|
||||||
|
if got := res.status; got != want {
|
||||||
|
t.Errorf("status: %v; want %v", got, want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestH2H2MultipleResponseCL(t *testing.T) {
|
func TestH2H2MultipleResponseCL(t *testing.T) {
|
||||||
st := newServerTester([]string{"--http2-bridge"}, t, func(w http.ResponseWriter, r *http.Request) {
|
st := newServerTester([]string{"--http2-bridge"}, t, func(w http.ResponseWriter, r *http.Request) {
|
||||||
w.Header().Add("content-length", "1")
|
w.Header().Add("content-length", "1")
|
||||||
|
|
|
@ -95,7 +95,9 @@ void connectcb(struct ev_loop *loop, ev_io *w, int revents) {
|
||||||
auto upstream = downstream->get_upstream();
|
auto upstream = downstream->get_upstream();
|
||||||
auto handler = upstream->get_client_handler();
|
auto handler = upstream->get_client_handler();
|
||||||
if (dconn->on_connect() != 0) {
|
if (dconn->on_connect() != 0) {
|
||||||
delete handler;
|
if (upstream->downstream_error(dconn, Downstream::EVENT_ERROR) != 0) {
|
||||||
|
delete handler;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
writecb(loop, w, revents);
|
writecb(loop, w, revents);
|
||||||
|
@ -747,6 +749,9 @@ end:
|
||||||
|
|
||||||
int HttpDownstreamConnection::on_connect() {
|
int HttpDownstreamConnection::on_connect() {
|
||||||
if (!util::check_socket_connected(fd_)) {
|
if (!util::check_socket_connected(fd_)) {
|
||||||
|
if (LOG_ENABLED(INFO)) {
|
||||||
|
DLOG(INFO, this) << "downstream connect failed";
|
||||||
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -560,6 +560,8 @@ int HttpsUpstream::downstream_error(DownstreamConnection *dconn, int events) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handler_->set_should_close_after_write(true);
|
||||||
|
|
||||||
unsigned int status;
|
unsigned int status;
|
||||||
if (events & Downstream::EVENT_TIMEOUT) {
|
if (events & Downstream::EVENT_TIMEOUT) {
|
||||||
status = 504;
|
status = 504;
|
||||||
|
|
Loading…
Reference in New Issue