mirror of
https://github.com/gofiber/fiber.git
synced 2025-02-23 15:03:46 +00:00
220 lines
5.2 KiB
Go
220 lines
5.2 KiB
Go
package proxy
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"net"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
"github.com/gofiber/fiber/v2/utils"
|
|
)
|
|
|
|
// go test -run Test_Proxy_Empty_Host
|
|
func Test_Proxy_Empty_Upstream_Servers(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
utils.AssertEqual(t, "Servers cannot be empty", r)
|
|
}
|
|
}()
|
|
app := fiber.New()
|
|
app.Use(Balancer(Config{Servers: []string{}}))
|
|
}
|
|
|
|
// go test -run Test_Proxy_Next
|
|
func Test_Proxy_Next(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
app := fiber.New()
|
|
app.Use(Balancer(Config{
|
|
Servers: []string{"127.0.0.1"},
|
|
Next: func(_ *fiber.Ctx) bool {
|
|
return true
|
|
},
|
|
}))
|
|
|
|
resp, err := app.Test(httptest.NewRequest("GET", "/", nil))
|
|
utils.AssertEqual(t, nil, err)
|
|
utils.AssertEqual(t, fiber.StatusNotFound, resp.StatusCode)
|
|
}
|
|
|
|
// go test -run Test_Proxy
|
|
func Test_Proxy(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
target := fiber.New(fiber.Config{DisableStartupMessage: true})
|
|
target.Get("/", func(c *fiber.Ctx) error {
|
|
return c.SendStatus(fiber.StatusTeapot)
|
|
})
|
|
|
|
ln, err := net.Listen(fiber.NetworkTCP4, "127.0.0.1:0")
|
|
utils.AssertEqual(t, nil, err)
|
|
|
|
go func() {
|
|
utils.AssertEqual(t, nil, target.Listener(ln))
|
|
}()
|
|
|
|
time.Sleep(2 * time.Second)
|
|
addr := ln.Addr().String()
|
|
|
|
resp, err := target.Test(httptest.NewRequest("GET", "/", nil), 2000)
|
|
utils.AssertEqual(t, nil, err)
|
|
utils.AssertEqual(t, fiber.StatusTeapot, resp.StatusCode)
|
|
|
|
app := fiber.New(fiber.Config{DisableStartupMessage: true})
|
|
|
|
app.Use(Balancer(Config{Servers: []string{addr}}))
|
|
|
|
req := httptest.NewRequest("GET", "/", nil)
|
|
req.Host = addr
|
|
resp, err = app.Test(req)
|
|
utils.AssertEqual(t, nil, err)
|
|
utils.AssertEqual(t, fiber.StatusTeapot, resp.StatusCode)
|
|
}
|
|
|
|
func Test_Proxy_Forward(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
app := fiber.New()
|
|
|
|
target := fiber.New(fiber.Config{DisableStartupMessage: true})
|
|
target.Get("/", func(c *fiber.Ctx) error {
|
|
return c.SendString("forwarded")
|
|
})
|
|
|
|
ln, err := net.Listen(fiber.NetworkTCP4, "127.0.0.1:0")
|
|
utils.AssertEqual(t, nil, err)
|
|
|
|
go func() {
|
|
utils.AssertEqual(t, nil, target.Listener(ln))
|
|
}()
|
|
|
|
time.Sleep(2 * time.Second)
|
|
addr := ln.Addr().String()
|
|
|
|
app.Use(Forward("http://" + addr))
|
|
|
|
resp, err := app.Test(httptest.NewRequest("GET", "/", nil))
|
|
utils.AssertEqual(t, nil, err)
|
|
utils.AssertEqual(t, fiber.StatusOK, resp.StatusCode)
|
|
|
|
b, err := ioutil.ReadAll(resp.Body)
|
|
utils.AssertEqual(t, nil, err)
|
|
utils.AssertEqual(t, "forwarded", string(b))
|
|
}
|
|
|
|
func Test_Proxy_Modify_Response(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
target := fiber.New(fiber.Config{DisableStartupMessage: true})
|
|
target.Get("/", func(c *fiber.Ctx) error {
|
|
return c.Status(500).SendString("not modified")
|
|
})
|
|
|
|
ln, err := net.Listen(fiber.NetworkTCP4, "127.0.0.1:0")
|
|
utils.AssertEqual(t, nil, err)
|
|
|
|
go func() {
|
|
utils.AssertEqual(t, nil, target.Listener(ln))
|
|
}()
|
|
|
|
time.Sleep(2 * time.Second)
|
|
addr := ln.Addr().String()
|
|
|
|
app := fiber.New()
|
|
app.Use(Balancer(Config{
|
|
Servers: []string{addr},
|
|
ModifyResponse: func(c *fiber.Ctx) error {
|
|
c.Response().SetStatusCode(fiber.StatusOK)
|
|
return c.SendString("modified response")
|
|
},
|
|
}))
|
|
|
|
resp, err := app.Test(httptest.NewRequest("GET", "/", nil))
|
|
utils.AssertEqual(t, nil, err)
|
|
utils.AssertEqual(t, fiber.StatusOK, resp.StatusCode)
|
|
|
|
b, err := ioutil.ReadAll(resp.Body)
|
|
utils.AssertEqual(t, nil, err)
|
|
utils.AssertEqual(t, "modified response", string(b))
|
|
}
|
|
|
|
func Test_Proxy_Modify_Request(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
target := fiber.New(fiber.Config{DisableStartupMessage: true})
|
|
target.Get("/", func(c *fiber.Ctx) error {
|
|
b := c.Request().Body()
|
|
return c.SendString(string(b))
|
|
})
|
|
|
|
ln, err := net.Listen(fiber.NetworkTCP4, "127.0.0.1:0")
|
|
utils.AssertEqual(t, nil, err)
|
|
|
|
go func() {
|
|
utils.AssertEqual(t, nil, target.Listener(ln))
|
|
}()
|
|
|
|
time.Sleep(2 * time.Second)
|
|
addr := ln.Addr().String()
|
|
|
|
app := fiber.New()
|
|
app.Use(Balancer(Config{
|
|
Servers: []string{addr},
|
|
ModifyRequest: func(c *fiber.Ctx) error {
|
|
c.Request().SetBody([]byte("modified request"))
|
|
return nil
|
|
},
|
|
}))
|
|
|
|
resp, err := app.Test(httptest.NewRequest("GET", "/", nil))
|
|
utils.AssertEqual(t, nil, err)
|
|
utils.AssertEqual(t, fiber.StatusOK, resp.StatusCode)
|
|
|
|
b, err := ioutil.ReadAll(resp.Body)
|
|
utils.AssertEqual(t, nil, err)
|
|
utils.AssertEqual(t, "modified request", string(b))
|
|
}
|
|
|
|
func Test_Proxy_Buffer_Size_Response(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
target := fiber.New(fiber.Config{DisableStartupMessage: true})
|
|
target.Get("/", func(c *fiber.Ctx) error {
|
|
long := strings.Join(make([]string, 5000), "-")
|
|
c.Response().Header.Set("Very-Long-Header", long)
|
|
return c.SendString("ok")
|
|
})
|
|
|
|
ln, err := net.Listen(fiber.NetworkTCP4, "127.0.0.1:0")
|
|
utils.AssertEqual(t, nil, err)
|
|
|
|
go func() {
|
|
utils.AssertEqual(t, nil, target.Listener(ln))
|
|
}()
|
|
|
|
time.Sleep(2 * time.Second)
|
|
addr := ln.Addr().String()
|
|
|
|
app := fiber.New()
|
|
app.Use(Balancer(Config{Servers: []string{addr}}))
|
|
|
|
resp, err := app.Test(httptest.NewRequest("GET", "/", nil))
|
|
utils.AssertEqual(t, nil, err)
|
|
utils.AssertEqual(t, fiber.StatusInternalServerError, resp.StatusCode)
|
|
|
|
app = fiber.New()
|
|
app.Use(Balancer(Config{
|
|
Servers: []string{addr},
|
|
ReadBufferSize: 1024 * 8,
|
|
}))
|
|
|
|
resp, err = app.Test(httptest.NewRequest("GET", "/", nil))
|
|
utils.AssertEqual(t, nil, err)
|
|
utils.AssertEqual(t, fiber.StatusOK, resp.StatusCode)
|
|
}
|