Skip to content

Commit 54e882e

Browse files
committed
modify /v1/about to include secured-signal-api
1 parent 5ec4261 commit 54e882e

7 files changed

Lines changed: 137 additions & 32 deletions

File tree

internals/proxy/middlewares/api.go

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
package middlewares
2+
3+
import (
4+
"bytes"
5+
"io"
6+
"net/http"
7+
"os"
8+
"regexp"
9+
"strings"
10+
11+
"github.com/codeshelldev/gotl/pkg/logger"
12+
"github.com/codeshelldev/gotl/pkg/request"
13+
"github.com/codeshelldev/secured-signal-api/internals/config"
14+
)
15+
16+
var InternalAPI Middleware = Middleware{
17+
Name: "_Internal_API",
18+
Use: internalAPIHandler,
19+
}
20+
21+
func internalAPIHandler(next http.Handler) http.Handler {
22+
mux := http.NewServeMux()
23+
24+
const aboutEndpoint = "/v1/about"
25+
mux.HandleFunc(aboutEndpoint, func(w http.ResponseWriter, req *http.Request) {
26+
res, err := redirectRequestToBackend(req, config.DEFAULT.API.URL + aboutEndpoint)
27+
28+
if err != nil {
29+
logger.Error("Error requesting Backend: ", err.Error())
30+
http.Error(w, "Internal Server Error ", http.StatusBadGateway)
31+
return
32+
}
33+
34+
body, err := request.GetResBody(res)
35+
36+
if err != nil {
37+
logger.Error("Could not get Response Body: ", err.Error())
38+
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
39+
return
40+
}
41+
42+
for key, values := range res.Header {
43+
for _, value := range values {
44+
w.Header().Add(key, value)
45+
}
46+
}
47+
48+
if !body.Empty {
49+
var version string
50+
51+
if isValidSemver(os.Getenv("IMAGE_TAG")) {
52+
version, _ = strings.CutPrefix(version, "v")
53+
}
54+
55+
payload := map[string]any{
56+
"version": version,
57+
"auth_required": !config.ENV.INSECURE,
58+
}
59+
60+
body.Data["secured-signal-api"] = payload
61+
62+
err := body.Write(w)
63+
64+
if err != nil {
65+
logger.Error("Could not write to Response Body: ", err.Error())
66+
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
67+
return
68+
}
69+
}
70+
71+
w.WriteHeader(res.StatusCode)
72+
})
73+
74+
mux.HandleFunc("/favicon.ico", func(w http.ResponseWriter, req *http.Request) {
75+
http.ServeFile(w, req, config.ENV.FAVICON_PATH)
76+
})
77+
78+
mux.Handle("/", next)
79+
80+
return mux
81+
}
82+
83+
func isValidSemver(version string) bool {
84+
re, err := regexp.Compile(`^v?([0-9]+)\.([0-9]+)\.([0-9]+)(-[0-9A-Za-z.-]+)?(\+[0-9A-Za-z.-]+)?$`)
85+
86+
if err != nil {
87+
return false
88+
}
89+
90+
return re.MatchString(version)
91+
}
92+
93+
func redirectRequestToBackend(req *http.Request, url string) (*http.Response, error) {
94+
var body io.Reader
95+
96+
if req.Body != nil {
97+
bodyBytes, err := io.ReadAll(req.Body)
98+
99+
if err != nil {
100+
return nil, err
101+
}
102+
req.Body.Close()
103+
104+
body = bytes.NewReader(bodyBytes)
105+
req.Body = io.NopCloser(bytes.NewReader(bodyBytes))
106+
}
107+
108+
return requestBackend(req.Method, url, body, req.Header)
109+
}
110+
111+
func requestBackend(method, url string, body io.Reader, headers map[string][]string) (*http.Response, error) {
112+
backendReq, err := http.NewRequest(method, url, body)
113+
if err != nil {
114+
return nil, err
115+
}
116+
117+
for key, values := range headers {
118+
for _, value := range values {
119+
backendReq.Header.Add(key, value)
120+
}
121+
}
122+
123+
client := &http.Client{}
124+
125+
res, err := client.Do(backendReq)
126+
if err != nil {
127+
return nil, err
128+
}
129+
130+
return res, nil
131+
}

internals/proxy/middlewares/auth.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,6 @@ var BodyAuth = AuthMethod{
108108
return "", nil
109109
}
110110

111-
body.Write(req)
112-
113111
if body.Empty {
114112
return "", nil
115113
}
@@ -129,7 +127,7 @@ var BodyAuth = AuthMethod{
129127
if isValidToken(tokens, auth) {
130128
delete(body.Data, authField)
131129

132-
body.Write(req)
130+
body.UpdateReq(req)
133131

134132
return auth, nil
135133
}
@@ -149,7 +147,7 @@ var QueryAuth = AuthMethod{
149147
const oldAuthQuery = "authorization"
150148

151149
if req.URL.Query().Has("@" + oldAuthQuery) {
152-
fullURL, _ := request.ParseRequestURL(req)
150+
fullURL, _ := request.ParseReqURL(req)
153151
urlWithNewAuthQuery := strings.Replace(fullURL.String(), "@" + oldAuthQuery, "@{s,fg=bright_red}" + oldAuthQuery + "{/}{b,fg=green}" + authQuery + "{/}", 1)
154152

155153
deprecation.Error(req.URL.String(), deprecation.DeprecationMessage{

internals/proxy/middlewares/mapping.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ func mappingHandler(next http.Handler) http.Handler {
6464
if modifiedBody {
6565
body.Data = bodyData
6666

67-
err := body.Write(req)
67+
err := body.UpdateReq(req)
6868

6969
if err != nil {
7070
logger.Error("Could not write to Request Body: ", err.Error())

internals/proxy/middlewares/message.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ func messageHandler(next http.Handler) http.Handler {
7272
if modifiedBody {
7373
body.Data = bodyData
7474

75-
err := body.Write(req)
75+
err := body.UpdateReq(req)
7676

7777
if err != nil {
7878
logger.Error("Could not write to Request Body: ", err.Error())

internals/proxy/middlewares/server.go

Lines changed: 0 additions & 24 deletions
This file was deleted.

internals/proxy/middlewares/template.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ func templateHandler(next http.Handler) http.Handler {
9696
if modifiedBody {
9797
body.Data = bodyData
9898

99-
err := body.Write(req)
99+
err := body.UpdateReq(req)
100100

101101
if err != nil {
102102
logger.Error("Could not write to Request Body: ", err.Error())

internals/proxy/proxy.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ func Create(targetUrl string) Proxy {
6767

6868
func (proxy Proxy) Init() http.Handler {
6969
handler := m.NewChain().
70-
Use(m.Server).
70+
Use(m.InternalAPI).
7171
Use(m.Auth).
7272
Use(m.InternalMiddlewareLogger).
7373
Use(m.InternalProxy).

0 commit comments

Comments
 (0)