264 lines
6.6 KiB
Python
264 lines
6.6 KiB
Python
"""Code exporter for HTTP entries (Python, JavaScript, Go)."""
|
|
|
|
import json
|
|
|
|
from http_log_explorer.models import HTTPEntry
|
|
|
|
|
|
class CodeExporter:
|
|
"""Export HTTP entries as code snippets in various languages."""
|
|
|
|
def __init__(self) -> None:
|
|
"""Initialize code exporter."""
|
|
self._template_dir = ""
|
|
|
|
PYTHON_TEMPLATE = '''import requests
|
|
|
|
headers = {headers}
|
|
{data}
|
|
response = requests.{method}(
|
|
"{url}"{params}
|
|
{headers_param})
|
|
{body}
|
|
print(response.status_code)
|
|
print(response.json())
|
|
'''
|
|
|
|
JAVASCRIPT_TEMPLATE = '''const axios = require('axios');
|
|
|
|
const config = {{
|
|
method: '{method}',
|
|
url: '{url}',
|
|
{headers_js}
|
|
{data_js}
|
|
{body_js}
|
|
}};
|
|
|
|
axios(config)
|
|
.then(response => {{
|
|
console.log(response.status);
|
|
console.log(response.data);
|
|
}})
|
|
.catch(error => {{
|
|
console.error(error);
|
|
}});
|
|
'''
|
|
|
|
GO_TEMPLATE = '''package main
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
)
|
|
|
|
func main() {{
|
|
{headers_go}
|
|
{data_go}
|
|
body{data_var} := {body_val}
|
|
{body_prep}
|
|
req, err := http.NewRequest("{method}", "{url}", {body_ref})
|
|
if err != nil {{
|
|
panic(err)
|
|
}}
|
|
{set_headers}
|
|
client := &http.Client{{}}
|
|
resp, err := client.Do(req)
|
|
if err != nil {{
|
|
panic(err)
|
|
}}
|
|
defer resp.Body.Close()
|
|
|
|
fmt.Println("Status:", resp.Status)
|
|
}}
|
|
|
|
'''
|
|
|
|
def export_python(self, entry: HTTPEntry) -> str:
|
|
"""Export entry as Python code.
|
|
|
|
Args:
|
|
entry: HTTPEntry object
|
|
|
|
Returns:
|
|
Python code string
|
|
"""
|
|
headers_str = self._format_python_dict(entry.request.headers)
|
|
|
|
data_line = ""
|
|
body_line = ""
|
|
params_line = ""
|
|
|
|
if entry.request.query_params:
|
|
params_line = f", params={self._format_python_dict(entry.request.query_params)}"
|
|
|
|
if entry.request.body:
|
|
body_line = "data=data,"
|
|
|
|
if entry.request.headers:
|
|
headers_param = "\n headers=headers"
|
|
else:
|
|
headers_param = ""
|
|
|
|
method_lower = entry.request.method.lower()
|
|
|
|
return self.PYTHON_TEMPLATE.format(
|
|
method=method_lower,
|
|
url=entry.request.url,
|
|
headers=headers_str,
|
|
params=params_line,
|
|
headers_param=headers_param,
|
|
data=data_line,
|
|
body=body_line,
|
|
)
|
|
|
|
def export_javascript(self, entry: HTTPEntry) -> str:
|
|
"""Export entry as JavaScript code.
|
|
|
|
Args:
|
|
entry: HTTPEntry object
|
|
|
|
Returns:
|
|
JavaScript code string
|
|
"""
|
|
headers_lines = []
|
|
for name, value in entry.request.headers.items():
|
|
headers_lines.append(f' "{name}": "{value}",')
|
|
|
|
headers_js = "\n".join(headers_lines)
|
|
if headers_js:
|
|
headers_js = "headers: {\n" + headers_js + "\n},"
|
|
|
|
data_js = ""
|
|
data_val = "{}"
|
|
body_js = ""
|
|
|
|
if entry.request.body:
|
|
data_val = json.dumps(entry.request.body)
|
|
data_js = f"const data = {data_val};"
|
|
body_js = "data: data,"
|
|
|
|
if entry.request.query_params:
|
|
data_val = json.dumps(entry.request.query_params)
|
|
data_js = f"const params = {data_val};"
|
|
body_js = "params: params,"
|
|
|
|
return self.JAVASCRIPT_TEMPLATE.format(
|
|
method=entry.request.method.lower(),
|
|
url=entry.request.url,
|
|
headers_js=headers_js,
|
|
data_js=data_js,
|
|
body_js=body_js,
|
|
)
|
|
|
|
def export_go(self, entry: HTTPEntry) -> str:
|
|
"""Export entry as Go code.
|
|
|
|
Args:
|
|
entry: HTTPEntry object
|
|
|
|
Returns:
|
|
Go code string
|
|
"""
|
|
headers_lines = []
|
|
for name, value in entry.request.headers.items():
|
|
headers_lines.append(f' req.Header.Set("{name}", "{value}")')
|
|
|
|
headers_go = "\n".join(headers_lines)
|
|
|
|
data_val = "nil"
|
|
data_var = ""
|
|
body_prep = ""
|
|
body_ref = "nil"
|
|
data_go = ""
|
|
|
|
if entry.request.body:
|
|
escaped = self._escape_go_string(entry.request.body)
|
|
data_val = f"`{escaped}`"
|
|
body_prep = f' body := bytes.NewBufferString({data_val})'
|
|
body_ref = "body"
|
|
|
|
set_headers = headers_go if headers_go else " // No headers"
|
|
|
|
return self.GO_TEMPLATE.format(
|
|
method=entry.request.method,
|
|
url=entry.request.url,
|
|
headers_go=headers_go,
|
|
data_go=data_go,
|
|
data_var=data_var,
|
|
body_val=data_val,
|
|
body_prep=body_prep,
|
|
body_ref=body_ref,
|
|
set_headers=set_headers,
|
|
)
|
|
|
|
def export_batch(
|
|
self, entries: list[HTTPEntry], language: str
|
|
) -> list[str]:
|
|
"""Export multiple entries as code snippets.
|
|
|
|
Args:
|
|
entries: List of HTTPEntry objects
|
|
language: Target language (python, javascript, go)
|
|
|
|
Returns:
|
|
List of code strings
|
|
|
|
Raises:
|
|
ValueError: If language is not supported
|
|
"""
|
|
language = language.lower()
|
|
if language == "python":
|
|
return [self.export_python(e) for e in entries]
|
|
elif language == "javascript":
|
|
return [self.export_javascript(e) for e in entries]
|
|
elif language == "go":
|
|
return [self.export_go(e) for e in entries]
|
|
else:
|
|
raise ValueError(
|
|
f"Unsupported language: {language}. "
|
|
f"Supported: python, javascript, go"
|
|
)
|
|
|
|
def _format_python_dict(self, d: dict[str, str]) -> str:
|
|
"""Format dictionary as Python code.
|
|
|
|
Args:
|
|
d: Dictionary to format
|
|
|
|
Returns:
|
|
Python dict string
|
|
"""
|
|
if not d:
|
|
return "{}"
|
|
items = [f'"{k}": "{v}"' for k, v in d.items()]
|
|
return "{\n " + ",\n ".join(items) + "\n}"
|
|
|
|
def _escape_go_string(self, s: str) -> str:
|
|
"""Escape string for Go.
|
|
|
|
Args:
|
|
s: String to escape
|
|
|
|
Returns:
|
|
Escaped string
|
|
"""
|
|
return s.replace("\\", "\\\\").replace("`", "\\`").replace("$", "\\$")
|
|
|
|
def to_file(
|
|
self, entries: list[HTTPEntry], path: str, language: str
|
|
) -> None:
|
|
"""Write code snippets to file.
|
|
|
|
Args:
|
|
entries: List of HTTPEntry objects
|
|
path: Output file path
|
|
language: Target language
|
|
"""
|
|
snippets = self.export_batch(entries, language)
|
|
with open(path, "w") as f:
|
|
for snippet in snippets:
|
|
f.write(snippet)
|
|
f.write("\n\n")
|