🧪 Add SSE test tools
This commit is contained in:
@@ -3,36 +3,46 @@ package navi
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/fasthttp/websocket"
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/proxy"
|
||||
"github.com/gofiber/fiber/v2/utils"
|
||||
"github.com/rs/zerolog/log"
|
||||
"github.com/samber/lo"
|
||||
"github.com/spf13/viper"
|
||||
"github.com/valyala/fasthttp"
|
||||
"io/fs"
|
||||
"net/http"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/fasthttp/websocket"
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/proxy"
|
||||
"github.com/gofiber/fiber/v2/utils"
|
||||
"github.com/samber/lo"
|
||||
"github.com/spf13/viper"
|
||||
"github.com/valyala/fasthttp"
|
||||
)
|
||||
|
||||
func makeHypertextResponse(c *fiber.Ctx, dest *Destination) error {
|
||||
func makeUnifiedResponse(c *fiber.Ctx, dest *Destination) error {
|
||||
if websocket.FastHTTPIsWebSocketUpgrade(c.Context()) {
|
||||
// Handle websocket
|
||||
return makeWebsocketResponse(c, dest)
|
||||
} else {
|
||||
// Handle normal request
|
||||
timeout := time.Duration(viper.GetInt64("performance.network_timeout")) * time.Millisecond
|
||||
return proxy.Do(c, dest.MakeUri(c), &fasthttp.Client{
|
||||
ReadTimeout: timeout,
|
||||
WriteTimeout: timeout,
|
||||
})
|
||||
_, queries := dest.GetRawUri()
|
||||
if len(queries.Get("sse")) > 0 {
|
||||
// Handle server-side event
|
||||
return makeSeverSideEventResponse(c, dest)
|
||||
} else {
|
||||
// Handle normal http request
|
||||
return makeHypertextResponse(c, dest)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func makeHypertextResponse(c *fiber.Ctx, dest *Destination) error {
|
||||
timeout := time.Duration(viper.GetInt64("performance.network_timeout")) * time.Millisecond
|
||||
return proxy.Do(c, dest.MakeUri(c), &fasthttp.Client{
|
||||
ReadTimeout: timeout,
|
||||
WriteTimeout: timeout,
|
||||
})
|
||||
}
|
||||
|
||||
var wsUpgrader = websocket.FastHTTPUpgrader{}
|
||||
|
||||
func makeWebsocketResponse(c *fiber.Ctx, dest *Destination) error {
|
||||
@@ -58,7 +68,7 @@ func makeWebsocketResponse(c *fiber.Ctx, dest *Destination) error {
|
||||
for {
|
||||
mode, message, err := remote.ReadMessage()
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
log.Warn().Err(err).Msg("An error occurred during the websocket proxying...")
|
||||
return
|
||||
} else {
|
||||
signal <- struct {
|
||||
@@ -88,6 +98,11 @@ func makeWebsocketResponse(c *fiber.Ctx, dest *Destination) error {
|
||||
})
|
||||
}
|
||||
|
||||
func makeSeverSideEventResponse(c *fiber.Ctx, dest *Destination) error {
|
||||
// TODO Impl SSE with https://github.com/gofiber/recipes/blob/master/sse/main.go
|
||||
return fiber.NewError(fiber.StatusNotImplemented, "Server-side-events was not available now.")
|
||||
}
|
||||
|
||||
func makeFileResponse(c *fiber.Ctx, dest *Destination) error {
|
||||
uri, queries := dest.GetRawUri()
|
||||
root := http.Dir(uri)
|
||||
|
@@ -7,14 +7,14 @@ import (
|
||||
)
|
||||
|
||||
type RoadApp struct {
|
||||
Regions []*Region `json:"regions"`
|
||||
Regions []*Region `json:"regions"`
|
||||
Traces []RoadTrace `json:"traces"`
|
||||
}
|
||||
|
||||
func (v *RoadApp) Forward(ctx *fiber.Ctx, dest *Destination) error {
|
||||
switch dest.GetType() {
|
||||
case DestinationHypertext:
|
||||
return makeHypertextResponse(ctx, dest)
|
||||
return makeUnifiedResponse(ctx, dest)
|
||||
case DestinationStaticFile:
|
||||
return makeFileResponse(ctx, dest)
|
||||
default:
|
||||
|
@@ -41,8 +41,12 @@ type Destination struct {
|
||||
Transformers []transformers.TransformerConfig `json:"transformers" toml:"transformers"`
|
||||
}
|
||||
|
||||
func (v *Destination) GetProtocol() string {
|
||||
return strings.SplitN(v.Uri, "://", 2)[0]
|
||||
}
|
||||
|
||||
func (v *Destination) GetType() DestinationType {
|
||||
protocol := strings.SplitN(v.Uri, "://", 2)[0]
|
||||
protocol := v.GetProtocol()
|
||||
switch protocol {
|
||||
case "http", "https":
|
||||
return DestinationHypertext
|
||||
@@ -56,7 +60,7 @@ func (v *Destination) GetRawUri() (string, url.Values) {
|
||||
uri := strings.SplitN(v.Uri, "://", 2)[1]
|
||||
data := strings.SplitN(uri, "?", 2)
|
||||
data = append(data, " ") // Make data array least have two element
|
||||
qs, _ := url.ParseQuery(data[0])
|
||||
qs, _ := url.ParseQuery(data[1])
|
||||
|
||||
return data[0], qs
|
||||
}
|
||||
@@ -71,8 +75,9 @@ func (v *Destination) MakeUri(ctx *fiber.Ctx) string {
|
||||
|
||||
path := string(ctx.Request().URI().Path())
|
||||
hash := string(ctx.Request().URI().Hash())
|
||||
uri, _ := v.GetRawUri()
|
||||
|
||||
return v.Uri + path +
|
||||
return uri + path +
|
||||
lo.Ternary(len(queries) > 0, "?"+strings.Join(queries, "&"), "") +
|
||||
lo.Ternary(len(hash) > 0, "#"+hash, "")
|
||||
}
|
||||
|
Reference in New Issue
Block a user