func TestIdleOriginDirect(t *testing.T) { okServer, err := impatientProxy(0, 30*time.Second) if err != nil { assert.Fail(t, "Error starting proxy server: %s", err) } impatientServer, err := impatientProxy(0, 50*time.Millisecond) if err != nil { assert.Fail(t, "Error starting proxy server: %s", err) } okForwardFn := func(conn net.Conn, proxy *server.Server, originURL *url.URL) { var buf [400]byte chunkedReq(t, &buf, conn, originURL) assert.Contains(t, string(buf[:]), "200 OK", "should succeed") } failForwardFn := func(conn net.Conn, proxy *server.Server, originURL *url.URL) { var buf [400]byte chunkedReq(t, &buf, conn, originURL) assert.Contains(t, string(buf[:]), "502 Bad Gateway", "should fail with 502") } testRoundTrip(t, okServer, httpOriginServer, okForwardFn) testRoundTrip(t, impatientServer, httpOriginServer, failForwardFn) }
func TestIdleClientConnections(t *testing.T) { limitedServer, err := setupNewHTTPServer(0, 100*time.Millisecond) if err != nil { assert.Fail(t, "Error starting proxy server") } okFn := func(conn net.Conn, proxy *server.Server, originURL *url.URL) { time.Sleep(time.Millisecond * 90) conn.Write([]byte("GET / HTTP/1.1\r\nHost: www.google.com\r\n\r\n")) var buf [400]byte _, err := conn.Read(buf[:]) assert.NoError(t, err) } idleFn := func(conn net.Conn, proxy *server.Server, originURL *url.URL) { time.Sleep(time.Millisecond * 110) conn.Write([]byte("GET / HTTP/1.1\r\nHost: www.google.com\r\n\r\n")) var buf [400]byte _, err := conn.Read(buf[:]) assert.Error(t, err) } go testRoundTrip(t, limitedServer, httpOriginServer, okFn) testRoundTrip(t, limitedServer, httpOriginServer, idleFn) }
func assertTimeoutError(t *testing.T, err error) { switch e := err.(type) { case net.Error: assert.True(t, e.Timeout(), "Error should be timeout") default: assert.Fail(t, "Error should be net.Error") } }
func TestMaxConnections(t *testing.T) { connectReq := "CONNECT %s HTTP/1.1\r\nHost: %s\r\n\r\n" limitedServer, err := setupNewHTTPServer(5, 30*time.Second) if err != nil { assert.Fail(t, "Error starting proxy server") } //limitedServer.httpServer.SetKeepAlivesEnabled(false) okFn := func(conn net.Conn, proxy *server.Server, originURL *url.URL) { req := fmt.Sprintf(connectReq, originURL.Host, originURL.Host) conn.Write([]byte(req)) var buf [400]byte _, err = conn.Read(buf[:]) assert.NoError(t, err) time.Sleep(time.Millisecond * 100) } waitFn := func(conn net.Conn, proxy *server.Server, originURL *url.URL) { conn.SetReadDeadline(time.Now().Add(50 * time.Millisecond)) req := fmt.Sprintf(connectReq, originURL.Host, originURL.Host) conn.Write([]byte(req)) var buf [400]byte _, err = conn.Read(buf[:]) if assert.Error(t, err) { e, ok := err.(*net.OpError) assert.True(t, ok && e.Timeout(), "should be a time out error") } } for i := 0; i < 5; i++ { go testRoundTrip(t, limitedServer, httpOriginServer, okFn) } time.Sleep(time.Millisecond * 10) for i := 0; i < 5; i++ { go testRoundTrip(t, limitedServer, httpOriginServer, waitFn) } time.Sleep(time.Millisecond * 100) for i := 0; i < 5; i++ { go testRoundTrip(t, limitedServer, httpOriginServer, okFn) } }
func TestIdleOriginConnect(t *testing.T) { okServer, err := impatientProxy(0, 30*time.Second) if err != nil { assert.Fail(t, "Error starting proxy server: %s", err) } impatientServer, err := impatientProxy(0, 50*time.Millisecond) if err != nil { assert.Fail(t, "Error starting proxy server: %s", err) } connectReq := func(conn net.Conn, proxy *server.Server, originURL *url.URL) error { reqStr := "CONNECT %s HTTP/1.1\r\nHost: %s\r\n\r\n" req := fmt.Sprintf(reqStr, originURL.Host, originURL.Host) conn.Write([]byte(req)) var buf [400]byte conn.Read(buf[:]) return chunkedReq(t, &buf, conn, originURL) } okConnectFn := func(conn net.Conn, proxy *server.Server, originURL *url.URL) { err := connectReq(conn, proxy, originURL) assert.NoError(t, err, "should succeed") } failConnectFn := func(conn net.Conn, proxy *server.Server, originURL *url.URL) { err := connectReq(conn, proxy, originURL) assert.Error(t, err, "should fail") } testRoundTrip(t, okServer, httpOriginServer, okConnectFn) testRoundTrip(t, impatientServer, httpOriginServer, failConnectFn) }