Spaces:
Runtime error
Runtime error
from collections.abc import Sequence | |
from typing import Literal, Optional, Dict, Any | |
import json | |
import gradio as gr | |
import requests | |
from tdagent.constants import HttpContentType | |
# Define valid HTTP methods | |
HttpMethod = Literal["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD"] | |
def make_http_request( | |
url: str, | |
method: HttpMethod = "GET", | |
content_type: str = "", | |
body: str = "", | |
timeout: float = 30, | |
custom_headers: str = "" | |
) -> tuple[str, str]: | |
"""Make an HTTP request to a URL with specified method and parameters. | |
Args: | |
url: The URL to make the request to. | |
method: HTTP method to use (GET, POST, PUT, DELETE, PATCH, HEAD). | |
content_type: Comma-separated string of content types. | |
body: Request body for methods that support it (POST, PUT, PATCH). | |
timeout: Request timeout in seconds. Defaults to 30. | |
custom_headers: JSON string of additional headers. | |
Returns: | |
A pair of strings (content, error_message). | |
""" | |
# Initialize headers dictionary | |
headers = {} | |
# Parse content type | |
if content_type: | |
headers["Accept"] = content_type | |
# Parse custom headers | |
if custom_headers: | |
try: | |
custom_headers_dict = json.loads(custom_headers) | |
headers.update(custom_headers_dict) | |
except json.JSONDecodeError: | |
return "", "Invalid JSON format in custom headers" | |
# Prepare request parameters | |
request_params: Dict[str, Any] = { | |
"url": url, | |
"headers": headers, | |
"timeout": timeout, | |
} | |
# Add body for methods that support it | |
if method in ["POST", "PUT", "PATCH"] and body: | |
request_params["data"] = body | |
try: | |
response = requests.request(method, **request_params) | |
except requests.exceptions.MissingSchema as err: | |
return "", str(err) | |
except requests.exceptions.RequestException as err: | |
return "", str(err) | |
try: | |
response.raise_for_status() | |
except requests.HTTPError as err: | |
return "", str(err) | |
# For HEAD requests, return headers as content | |
if method == "HEAD": | |
return str(dict(response.headers)), "" | |
return response.text, "" | |
# Create the Gradio interface | |
gr_make_http_request = gr.Interface( | |
fn=make_http_request, | |
inputs=[ | |
gr.Textbox(label="URL"), | |
gr.Dropdown( | |
choices=["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD"], | |
label="HTTP Method", | |
value="GET" | |
), | |
gr.Textbox( | |
label="Content Type", | |
placeholder="text/html,application/json" | |
), | |
gr.Textbox( | |
label="Request Body (for POST/PUT/PATCH)", | |
lines=3, | |
placeholder='{"key": "value"}' | |
), | |
gr.Number( | |
label="Timeout (seconds)", | |
value=30, | |
minimum=1, | |
maximum=300 | |
), | |
gr.Textbox( | |
label="Custom Headers (JSON format)", | |
placeholder='{"Authorization": "Bearer token"}' | |
) | |
], | |
outputs=gr.Text(label="Response"), | |
title="Make HTTP Requests", | |
description=( | |
"Make HTTP requests with different methods and parameters. " | |
"Supports GET, POST, PUT, DELETE, PATCH, and HEAD methods. " | |
"For POST, PUT, and PATCH requests, you can include a request body. " | |
"Custom headers can be added in JSON format. " | |
"Be cautious when accessing unknown URLs." | |
), | |
examples=[ | |
["https://google.com", "GET", "text/html", "", 30, ""], | |
["https://api.example.com/data", "POST", "application/json", '{"key": "value"}', 30, '{"Authorization": "Bearer token"}'], | |
], | |
) | |
if __name__ == "__main__": | |
gr_make_http_request.launch() |