From 04acd33765bc5bf1dd26d82d9ee3d5b637ac3bdb Mon Sep 17 00:00:00 2001 From: 7000pctAUTO Date: Sun, 22 Mar 2026 10:44:36 +0000 Subject: [PATCH] Initial upload: curl-converter-cli with CI/CD workflow --- curlconverter/generators/go.go | 108 +++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 curlconverter/generators/go.go diff --git a/curlconverter/generators/go.go b/curlconverter/generators/go.go new file mode 100644 index 0000000..b74d80c --- /dev/null +++ b/curlconverter/generators/go.go @@ -0,0 +1,108 @@ +"""Go code generator.""" + +import json +from curlconverter.parser import ParsedCurl +from curlconverter.generators import register_generator + + +def _detect_content_type(headers: dict, data: str) -> str: + """Detect content type from headers or data.""" + if "Content-Type" in headers: + return headers["Content-Type"] + if "content-type" in headers: + return headers["content-type"] + if data: + try: + json.loads(data) + return "application/json" + except (json.JSONDecodeError, TypeError): + pass + return "application/x-www-form-urlencoded" + + +@register_generator("go") +def generate_go(parsed: ParsedCurl) -> str: + """Generate Go net/http code from parsed curl data.""" + lines = [] + lines.append("package main") + lines.append("") + lines.append('import (') + lines.append(' "bytes"') + lines.append(' "fmt"') + lines.append(' "net/http"') + lines.append(' "io/ioutil"') + lines.append(")") + lines.append("") + + lines.append("func main() {") + lines.append(f' url := "{parsed.url}"') + lines.append("") + + headers = dict(parsed.headers) if parsed.headers else {} + + if parsed.user_agent and "User-Agent" not in headers and "user-agent" not in headers: + headers["User-Agent"] = parsed.user_agent + + if headers: + lines.append(" headers := map[string]string{") + for k, v in headers.items(): + lines.append(f' "{k}": "{v}",') + lines.append(" }") + lines.append("") + + body_var = "" + if parsed.data: + content_type = _detect_content_type(headers, parsed.data) + + if content_type == "application/json": + try: + json_data = json.loads(parsed.data) + json_str = json.dumps(json_data) + lines.append(f' jsonData := `{json_str}`') + body_var = "bytes.NewBuffer([]byte(jsonData))" + except (json.JSONDecodeError, TypeError): + escaped = parsed.data.replace("`", "\\`").replace("${", "\\$ {") + lines.append(f' data := `{escaped}`') + body_var = "bytes.NewBuffer([]byte(data))" + else: + escaped = parsed.data.replace("`", "\\`").replace("${", "\\$ {") + lines.append(f' data := `{escaped}`') + body_var = "bytes.NewBuffer([]byte(data))" + + if "Content-Type" not in headers and "content-type" not in headers: + headers["Content-Type"] = content_type + + lines.append("") + + lines.append(f' req, err := http.NewRequest("{parsed.method}", url, {body_var or "nil"})') + lines.append(" if err != nil {") + lines.append(" panic(err)") + lines.append(" }") + lines.append("") + + if headers: + lines.append(" for key, value := range headers {") + lines.append(" req.Header.Add(key, value)") + lines.append(" }") + lines.append("") + + if parsed.auth: + lines.append(f' req.SetBasicAuth("{parsed.auth[0]}", "{parsed.auth[1]}")') + lines.append("") + + if parsed.cookies: + lines.append(f' req.Header.Add("Cookie", "{parsed.cookies}")') + lines.append("") + + lines.append(" client := &http.Client{}") + lines.append(" resp, err := client.Do(req)") + lines.append(" if err != nil {") + lines.append(" panic(err)") + lines.append(" }") + lines.append(" defer resp.Body.Close()") + lines.append("") + lines.append(" body, _ := ioutil.ReadAll(resp.Body)") + lines.append(" fmt.Println(string(body))") + lines.append("}") + + return "\n".join(lines)