|
@@ -6,6 +6,7 @@ import (
|
|
"encoding/json"
|
|
"encoding/json"
|
|
"fmt"
|
|
"fmt"
|
|
"io"
|
|
"io"
|
|
|
|
+ "mime/multipart"
|
|
"net/http"
|
|
"net/http"
|
|
"strings"
|
|
"strings"
|
|
|
|
|
|
@@ -19,7 +20,88 @@ const (
|
|
// forwardRequestWithJWT forwards the request to target URL with JWT token and original request data
|
|
// forwardRequestWithJWT forwards the request to target URL with JWT token and original request data
|
|
func forwardRequestWithJWT(c *gin.Context, targetURL string) (interface{}, error) {
|
|
func forwardRequestWithJWT(c *gin.Context, targetURL string) (interface{}, error) {
|
|
jwtToken := c.GetHeader("Authorization")
|
|
jwtToken := c.GetHeader("Authorization")
|
|
|
|
+ fmt.Println(c.Copy().GetHeader("Content-Type"))
|
|
|
|
+
|
|
|
|
+ // Check if the request is multipart
|
|
|
|
+ if c.Request.MultipartForm != nil || strings.HasPrefix(c.GetHeader("Content-Type"), "multipart/form-data") {
|
|
|
|
+ err := c.Request.ParseMultipartForm(32 << 20) // 32MB max memory
|
|
|
|
+ if err != nil {
|
|
|
|
+ return nil, fmt.Errorf("parse multipart form error: %v", err)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Create a pipe to write the form data
|
|
|
|
+ pr, pw := io.Pipe()
|
|
|
|
+ writer := multipart.NewWriter(pw)
|
|
|
|
+
|
|
|
|
+ // Start goroutine to write form data
|
|
|
|
+ go func() {
|
|
|
|
+ defer pw.Close()
|
|
|
|
+ defer writer.Close()
|
|
|
|
+
|
|
|
|
+ // Copy all form fields
|
|
|
|
+ for key, values := range c.Request.MultipartForm.Value {
|
|
|
|
+ for _, value := range values {
|
|
|
|
+ writer.WriteField(key, value)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Copy all files
|
|
|
|
+ for key, fileHeaders := range c.Request.MultipartForm.File {
|
|
|
|
+ for _, fileHeader := range fileHeaders {
|
|
|
|
+ part, err := writer.CreateFormFile(key, fileHeader.Filename)
|
|
|
|
+ if err != nil {
|
|
|
|
+ pw.CloseWithError(err)
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ file, err := fileHeader.Open()
|
|
|
|
+ if err != nil {
|
|
|
|
+ pw.CloseWithError(err)
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ if _, err := io.Copy(part, file); err != nil {
|
|
|
|
+ file.Close()
|
|
|
|
+ pw.CloseWithError(err)
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ file.Close()
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }()
|
|
|
|
+
|
|
|
|
+ // Create new request with the piped body
|
|
|
|
+ req, err := http.NewRequest(c.Request.Method, targetURL, pr)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return nil, fmt.Errorf("create request error: %v", err)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Set headers
|
|
|
|
+ req.Header.Set("Content-Type", writer.FormDataContentType())
|
|
|
|
+ req.Header.Set("Authorization", jwtToken)
|
|
|
|
+
|
|
|
|
+ // Make the request
|
|
|
|
+ client := &http.Client{}
|
|
|
|
+ resp, err := client.Do(req)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return nil, fmt.Errorf("do request error: %v", err)
|
|
|
|
+ }
|
|
|
|
+ defer resp.Body.Close()
|
|
|
|
+
|
|
|
|
+ // Read response body
|
|
|
|
+ body, err := io.ReadAll(resp.Body)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return nil, fmt.Errorf("read response body error: %v", err)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Parse response
|
|
|
|
+ var result interface{}
|
|
|
|
+ if err := json.Unmarshal(body, &result); err != nil {
|
|
|
|
+ return nil, fmt.Errorf("parse response error: %v", err)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return result, nil
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ // Handle non-multipart requests
|
|
var req *http.Request
|
|
var req *http.Request
|
|
var err error
|
|
var err error
|
|
|
|
|
|
@@ -42,18 +124,8 @@ func forwardRequestWithJWT(c *gin.Context, targetURL string) (interface{}, error
|
|
|
|
|
|
req.Header.Set("Authorization", jwtToken)
|
|
req.Header.Set("Authorization", jwtToken)
|
|
|
|
|
|
- fmt.Println(c.Copy().GetHeader("Content-Type"))
|
|
|
|
- // Set content type
|
|
|
|
if c.Request.Method == "POST" {
|
|
if c.Request.Method == "POST" {
|
|
- if strings.Contains(targetURL, "/api/set-password") {
|
|
|
|
- req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
|
|
|
- } else if contentType := c.GetHeader("Content-Type"); contentType != "" {
|
|
|
|
- req.Header.Set("Content-Type", contentType)
|
|
|
|
- } else {
|
|
|
|
- req.Header.Set("Content-Type", "application/json")
|
|
|
|
- }
|
|
|
|
- } else if contentType := c.GetHeader("Content-Type"); contentType != "" {
|
|
|
|
- req.Header.Set("Content-Type", contentType)
|
|
|
|
|
|
+ req.Header.Set("Content-Type", "application/json")
|
|
}
|
|
}
|
|
|
|
|
|
// Accept gzip encoding
|
|
// Accept gzip encoding
|