feat: implement Goong service and controller for location functionality and update database schema diagram
All checks were successful
Build and Release / release (push) Successful in 1m28s
All checks were successful
Build and Release / release (push) Successful in 1m28s
This commit is contained in:
4718
FinalProject.drawio
4718
FinalProject.drawio
File diff suppressed because it is too large
Load Diff
@@ -84,7 +84,11 @@ func (ctrl *goongController) Proxy(c fiber.Ctx) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if c.Method() == "GET" {
|
if c.Method() == "GET" {
|
||||||
c.Set("Cache-Control", "public, max-age=86400")
|
if statusCode == fiber.StatusOK || statusCode == fiber.StatusNotModified {
|
||||||
|
c.Set("Cache-Control", "public, max-age=86400")
|
||||||
|
} else {
|
||||||
|
c.Set("Cache-Control", "no-store, no-cache, must-revalidate")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.Status(statusCode).Send(respBody)
|
return c.Status(statusCode).Send(respBody)
|
||||||
|
|||||||
@@ -25,12 +25,21 @@ type CacheEntry struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type goongService struct {
|
type goongService struct {
|
||||||
redis cache.Cache
|
redis cache.Cache
|
||||||
|
httpClient *http.Client
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewGoongService(redis cache.Cache) GoongService {
|
func NewGoongService(redis cache.Cache) GoongService {
|
||||||
return &goongService{
|
return &goongService{
|
||||||
redis: redis,
|
redis: redis,
|
||||||
|
httpClient: &http.Client{
|
||||||
|
Timeout: 15 * time.Second,
|
||||||
|
Transport: &http.Transport{
|
||||||
|
MaxIdleConns: 100,
|
||||||
|
MaxIdleConnsPerHost: 100,
|
||||||
|
IdleConnTimeout: 90 * time.Second,
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,14 +88,22 @@ func (s *goongService) ProxyRequest(ctx context.Context, method string, targetUR
|
|||||||
|
|
||||||
for k, v := range headers {
|
for k, v := range headers {
|
||||||
lowerK := strings.ToLower(k)
|
lowerK := strings.ToLower(k)
|
||||||
if lowerK == "host" || lowerK == "connection" || lowerK == "accept-encoding" {
|
if lowerK == "host" || lowerK == "connection" || lowerK == "accept-encoding" || lowerK == "keep-alive" || lowerK == "te" || lowerK == "transfer-encoding" || lowerK == "upgrade" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if strings.HasPrefix(lowerK, "cf-") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if strings.HasPrefix(lowerK, "x-forwarded-") || lowerK == "x-real-ip" || lowerK == "true-client-ip" || lowerK == "cdn-loop" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if lowerK == "cookie" || lowerK == "authorization" || lowerK == "x-api-key" || lowerK == "x-csrf-token" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
req.Header.Set(k, v)
|
req.Header.Set(k, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
client := &http.Client{Timeout: 15 * time.Second}
|
resp, err := s.httpClient.Do(req)
|
||||||
resp, err := client.Do(req)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 500, nil, nil, fmt.Errorf("failed to fetch from target: %w", err)
|
return 500, nil, nil, fmt.Errorf("failed to fetch from target: %w", err)
|
||||||
}
|
}
|
||||||
@@ -99,6 +116,23 @@ func (s *goongService) ProxyRequest(ctx context.Context, method string, targetUR
|
|||||||
|
|
||||||
respHeaders := make(map[string]string)
|
respHeaders := make(map[string]string)
|
||||||
for k, v := range resp.Header {
|
for k, v := range resp.Header {
|
||||||
|
lowerK := strings.ToLower(k)
|
||||||
|
// Skip hop-by-hop/transport headers in response
|
||||||
|
if lowerK == "connection" || lowerK == "keep-alive" || lowerK == "transfer-encoding" || lowerK == "upgrade" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// Skip Cloudflare headers from Goong to prevent clashing with our own server
|
||||||
|
if strings.HasPrefix(lowerK, "cf-") || lowerK == "server" || lowerK == "date" || lowerK == "alt-svc" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// Skip CORS headers (handled by our own Fiber CORS middleware)
|
||||||
|
if strings.HasPrefix(lowerK, "access-control-") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// Skip content encoding/length (handled by Fiber / Go client automatically)
|
||||||
|
if lowerK == "content-encoding" || lowerK == "content-length" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
respHeaders[k] = v[0]
|
respHeaders[k] = v[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user