from remote-desktop 3 달 전
부모
커밋
cf828f656c
1개의 변경된 파일83개의 추가작업 그리고 11개의 파일을 삭제
  1. 83 11
      src/api/user.go

+ 83 - 11
src/api/user.go

@@ -6,6 +6,7 @@ import (
 	"encoding/json"
 	"fmt"
 	"io"
+	"mime/multipart"
 	"net/http"
 	"strings"
 
@@ -19,7 +20,88 @@ const (
 // forwardRequestWithJWT forwards the request to target URL with JWT token and original request data
 func forwardRequestWithJWT(c *gin.Context, targetURL string) (interface{}, error) {
 	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 err error
 
@@ -42,18 +124,8 @@ func forwardRequestWithJWT(c *gin.Context, targetURL string) (interface{}, error
 
 	req.Header.Set("Authorization", jwtToken)
 
-	fmt.Println(c.Copy().GetHeader("Content-Type"))
-	// Set content type
 	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