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