This commit is contained in:
134
src/http_convert/generators.py
Normal file
134
src/http_convert/generators.py
Normal 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}")
|
||||||
Reference in New Issue
Block a user