From 27cb30deec4d18c45ac1563a2f94503248f8b333 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=AC=E6=98=8E?= <83812544+Ed1s0nZ@users.noreply.github.com> Date: Wed, 23 Apr 2025 17:16:35 +0800 Subject: [PATCH] Update tools.go --- tools.go | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/tools.go b/tools.go index 1ea3c06..9dfc9f1 100644 --- a/tools.go +++ b/tools.go @@ -1,7 +1,10 @@ package main import ( + "bytes" + "encoding/json" "fmt" + "net/url" "regexp" "strings" ) @@ -115,3 +118,78 @@ func GeneratePattern(keywords []string) string { pattern.WriteString(")") return pattern.String() } + +type HTTPRequest struct { + Method string `json:"Method"` + URL struct { + Path string `json:"Path"` + RawQuery string `json:"RawQuery"` + } `json:"URL"` + Proto string `json:"Proto"` + Header map[string][]string `json:"Header"` + Body string `json:"Body"` +} + +func generateHTTPRequest(input string) (string, error) { + var req HTTPRequest + err := json.Unmarshal([]byte(input), &req) + if err != nil { + return "", fmt.Errorf("failed to parse JSON: %v", err) + } + + // 构建 URL + var urlString string + if req.URL.Path != "" { + urlString = req.URL.Path + } + if req.URL.RawQuery != "" { + urlString += "?" + req.URL.RawQuery + } + + // 构建请求行 + requestLine := fmt.Sprintf("%s %s %s", req.Method, urlString, req.Proto) + + // 构建 Header + var headerLines []string + for key, values := range req.Header { + if len(values) > 0 { + // 将多个值用逗号分隔 + headerLines = append(headerLines, fmt.Sprintf("%s: %s", key, strings.Join(values, ","))) + } + } + + // 特殊处理 Origin 和 Referer + if val, ok := req.Header["Origin"]; ok && len(val) > 0 { + origin := val[0] + parsedOrigin, err := url.Parse(origin) + if err == nil { + headerLines = append(headerLines, fmt.Sprintf("Origin: %s", parsedOrigin.String())) + } + } + + if val, ok := req.Header["Referer"]; ok && len(val) > 0 { + referer := val[0] + parsedReferer, err := url.Parse(referer) + if err == nil { + headerLines = append(headerLines, fmt.Sprintf("Referer: %s", parsedReferer.String())) + } + } + + // 如果 Body 不为空,计算 Content-Length + if req.Body != "" { + contentLength := len(req.Body) + headerLines = append(headerLines, fmt.Sprintf("Content-Length: %d", contentLength)) + } + + // 构建最终的 HTTP 请求字符串 + var buffer bytes.Buffer + buffer.WriteString(requestLine + "\n") + for _, line := range headerLines { + buffer.WriteString(line + "\n") + } + if req.Body != "" { + buffer.WriteString("\n" + req.Body) + } + fmt.Println(buffer.String()) + return buffer.String(), nil +}