From bf9ec2c877db8881e7e5a9984ebfcd4b47f777d1 Mon Sep 17 00:00:00 2001 From: Lukasz Raczylo Date: Thu, 12 Oct 2023 21:16:57 +0100 Subject: [PATCH] Reuse fasthttp client --- go.mod | 4 ++-- go.sum | 4 ++-- main.go | 1 + proxy.go | 21 ++++++++++++++++++--- struct_config.go | 3 +++ 5 files changed, 26 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 0c1a95d..a4fce38 100644 --- a/go.mod +++ b/go.mod @@ -12,9 +12,10 @@ require ( github.com/json-iterator/go v1.1.12 github.com/lukaszraczylo/ask v0.0.0-20230927103145-2ff1123b4415 github.com/lukaszraczylo/go-ratecounter v0.1.8 - github.com/lukaszraczylo/go-simple-graphql v1.1.31 + github.com/lukaszraczylo/go-simple-graphql v1.1.32 github.com/rs/zerolog v1.31.0 github.com/stretchr/testify v1.8.4 + github.com/valyala/fasthttp v1.50.0 ) require ( @@ -34,7 +35,6 @@ require ( github.com/rivo/uniseg v0.4.4 // indirect github.com/rogpeppe/go-internal v1.11.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/fasthttp v1.50.0 // indirect github.com/valyala/fastrand v1.1.0 // indirect github.com/valyala/histogram v1.2.0 // indirect github.com/valyala/tcplisten v1.0.0 // indirect diff --git a/go.sum b/go.sum index fed8b35..d051481 100644 --- a/go.sum +++ b/go.sum @@ -40,8 +40,8 @@ github.com/lukaszraczylo/ask v0.0.0-20230927103145-2ff1123b4415 h1:lvI8Wlbg4PxkR github.com/lukaszraczylo/ask v0.0.0-20230927103145-2ff1123b4415/go.mod h1:M+UVdyqZs++xtEPrascaVmZdOMhCnxjZ2SgH+xHpR0c= github.com/lukaszraczylo/go-ratecounter v0.1.8 h1:ZYm6Wkn58ZAlFWRmC7PaD4oAYHWcu8/0MUDWGe3PnJQ= github.com/lukaszraczylo/go-ratecounter v0.1.8/go.mod h1:TqXEOCtFJStk1i0tkipprv1kiDHGon1MVUisjSTBSKM= -github.com/lukaszraczylo/go-simple-graphql v1.1.31 h1:UA3f8M1cV+XnO8UZlAqveW0qF/2NN512eB/gRqe+BHs= -github.com/lukaszraczylo/go-simple-graphql v1.1.31/go.mod h1:MyftQ8jTdtkYImPXJpHoxz6+E53Ydv+7q9+Jr+eT8WU= +github.com/lukaszraczylo/go-simple-graphql v1.1.32 h1:udiz2hnLNO2b/hc9Z0xcjYt+HcFbChQQuIY4HZmky80= +github.com/lukaszraczylo/go-simple-graphql v1.1.32/go.mod h1:c1nN/qtjsvpqpkBFsnBCYCDLdLMuWzy/zxeJzTjm5qg= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= diff --git a/main.go b/main.go index 22ed081..3f559a5 100644 --- a/main.go +++ b/main.go @@ -42,6 +42,7 @@ func parseConfig() { } return strings.Split(urls, ",") }() + c.Client.FastProxyClient = createFasthttpClient() cfg = &c enableCache() // takes close to no resources, but can be used with dynamic query cache loadRatelimitConfig() diff --git a/proxy.go b/proxy.go index e815a0f..6a08f66 100644 --- a/proxy.go +++ b/proxy.go @@ -2,12 +2,29 @@ package main import ( "crypto/tls" + "time" fiber "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/proxy" libpack_monitoring "github.com/lukaszraczylo/graphql-monitoring-proxy/monitoring" + "github.com/valyala/fasthttp" ) +func createFasthttpClient() *fasthttp.Client { + return &fasthttp.Client{ + Name: "graphql_proxy", + NoDefaultUserAgentHeader: true, + TLSConfig: &tls.Config{ + InsecureSkipVerify: true, + }, + MaxConnsPerHost: 100, + MaxIdleConnDuration: 2 * time.Minute, + ReadTimeout: time.Second * 10, + WriteTimeout: time.Second * 10, + DisableHeaderNamesNormalizing: true, + } +} + func proxyTheRequest(c *fiber.Ctx) error { if !checkAllowedURLs(c) { cfg.Logger.Error("Request blocked", map[string]interface{}{"path": c.Path()}) @@ -19,9 +36,7 @@ func proxyTheRequest(c *fiber.Ctx) error { c.Request().Header.Add("X-Real-IP", c.IP()) c.Request().Header.Add(fiber.HeaderXForwardedFor, string(c.Request().Header.Peek("X-Forwarded-For"))) - proxy.WithTlsConfig(&tls.Config{ - InsecureSkipVerify: true, - }) + proxy.WithClient(cfg.Client.FastProxyClient) err := proxy.DoRedirects(c, cfg.Server.HostGraphQL+c.Path(), 3) if err != nil { diff --git a/struct_config.go b/struct_config.go index 2e28c56..ce2bec6 100644 --- a/struct_config.go +++ b/struct_config.go @@ -5,6 +5,7 @@ import ( graphql "github.com/lukaszraczylo/go-simple-graphql" libpack_logging "github.com/lukaszraczylo/graphql-monitoring-proxy/logging" libpack_monitoring "github.com/lukaszraczylo/graphql-monitoring-proxy/monitoring" + "github.com/valyala/fasthttp" ) // config is a struct that holds the configuration of the application. @@ -28,6 +29,8 @@ type config struct { RoleRateLimit bool RoleFromHeader string GQLClient *graphql.BaseClient + FastProxyClient *fasthttp.Client + proxy string } Cache struct {