Initial commit: Add http-convert project
Some checks failed
CI / test (push) Has been cancelled

This commit is contained in:
2026-01-29 11:34:23 +00:00
parent 482cda8379
commit cb02ae679a

View File

@@ -0,0 +1,134 @@
import json
from typing import Dict, Optional
from .models import HTTPRequest, OutputFormat
class CurlGenerator:
@staticmethod
def generate(request: HTTPRequest, compact: bool = False) -> str:
parts = ["curl"]
if request.method.value != "GET":
parts.append(f"-X {request.method.value}")
for key, value in request.headers.items():
parts.append(f"-H '{key}: {value}'")
final_url = request.get_final_url()
parts.append(f"'{final_url}'")
if request.body:
parts.append(f"-d '{request.body}'")
elif request.body_json:
json_body = json.dumps(request.body_json)
parts.append(f"-d '{json_body}'")
if compact:
return " ".join(parts)
else:
return " \\\n ".join(parts)
@staticmethod
def generate_multiline(request: HTTPRequest) -> str:
return CurlGenerator.generate(request, compact=False)
class HTTPieGenerator:
@staticmethod
def generate(request: HTTPRequest, compact: bool = False) -> str:
parts = []
parts.append(f"{request.method.value} {request.url}")
for key, value in request.headers.items():
parts.append(f"'{key}:{value}'")
for key, value in request.params.items():
parts.append(f"{key}=={value}")
if request.body:
parts.append(f"'{request.body}'")
elif request.body_json:
json_body = json.dumps(request.body_json)
parts.append(f"'{json_body}'")
if compact:
return " ".join(parts)
else:
return " \\\n ".join(parts)
class FetchGenerator:
@staticmethod
def generate(request: HTTPRequest, compact: bool = False) -> str:
headers = ""
for key, value in request.headers.items():
headers += f" {key}: '{value}',\n"
headers = headers.rstrip(",\n")
body = ""
if request.body:
body = f"\n body: JSON.stringify({json.dumps(request.body)}),"
elif request.body_json:
body = f"\n body: JSON.stringify({json.dumps(request.body_json)}),"
options = f"""{{
method: '{request.method.value}',{body}
headers: {{
{headers}
}}
}}"""
result = f"fetch('{request.get_final_url()}',\n {options}\n)"
if compact:
result = result.replace("\n", " ").replace(" ", " ")
return result
class AxiosGenerator:
@staticmethod
def generate(request: HTTPRequest, compact: bool = False) -> str:
headers = ""
for key, value in request.headers.items():
headers += f" {key}: '{value}',\n"
headers = headers.rstrip(",\n")
data = ""
if request.body_json:
data = f"\n data: {json.dumps(request.body_json)},"
elif request.body:
data = f"\n data: {json.dumps(request.body)},"
options = f"""{{
method: '{request.method.value}',
url: '{request.url}',{data}
headers: {{
{headers}
}}
}}"""
result = f"axios({options})"
if compact:
result = result.replace("\n", " ").replace(" ", " ")
return result
class Generator:
@staticmethod
def generate(request: HTTPRequest, format: OutputFormat, compact: bool = False) -> str:
format_str = format.value if hasattr(format, 'value') else format
if format_str == "curl":
return CurlGenerator.generate(request, compact)
elif format_str == "httpie":
return HTTPieGenerator.generate(request, compact)
elif format_str == "fetch":
return FetchGenerator.generate(request, compact)
elif format_str == "axios":
return AxiosGenerator.generate(request, compact)
else:
raise ValueError(f"Unsupported format: {format}")