Spaces:
Paused
Paused
| import gradio as gr | |
| import requests | |
| import socket | |
| from urllib.parse import urlparse | |
| import traceback | |
| DEFAULT_TEST_URL = "https://realfavicongenerator.net/api/v2" | |
| DEFAULT_RFG_ANALYSIS_ENDPOINT = "https://realfavicongenerator.net/api/v2/favicons/analysis" | |
| def normalize_url(url: str) -> str: | |
| url = (url or "").strip() | |
| if not url: | |
| return "" | |
| if not url.startswith(("http://", "https://")): | |
| url = "https://" + url | |
| return url | |
| def ping_url(url: str, method: str = "GET", timeout_sec: float = 10.0) -> str: | |
| url = normalize_url(url) | |
| if not url: | |
| return "ERROR: URL is empty" | |
| try: | |
| resp = requests.request(method=method, url=url, timeout=timeout_sec) | |
| lines = [ | |
| f"Request: {method} {url}", | |
| f"Status code: {resp.status_code}", | |
| f"Elapsed: {resp.elapsed.total_seconds():.3f} seconds", | |
| "", | |
| "=== Response headers ===", | |
| ] | |
| for k, v in resp.headers.items(): | |
| lines.append(f"{k}: {v}") | |
| lines.extend( | |
| [ | |
| "", | |
| "=== First 1000 characters of body ===", | |
| resp.text[:1000], | |
| ] | |
| ) | |
| return "\n".join(lines) | |
| except Exception as e: | |
| return "ERROR while calling URL: " + repr(e) + "\n\n" + traceback.format_exc() | |
| def resolve_domain(target: str) -> str: | |
| target = (target or "").strip() | |
| if not target: | |
| return "ERROR: Empty input" | |
| if "://" in target: | |
| hostname = urlparse(target).hostname or target | |
| else: | |
| hostname = target | |
| try: | |
| infos = socket.getaddrinfo(hostname, None) | |
| ips = sorted({item[4][0] for item in infos}) | |
| lines = [ | |
| f"Input: {target}", | |
| f"Hostname: {hostname}", | |
| "", | |
| "Resolved IP addresses:", | |
| ] | |
| if ips: | |
| lines.extend(ips) | |
| else: | |
| lines.append("(no IPs returned)") | |
| return "\n".join(lines) | |
| except Exception as e: | |
| return "ERROR while resolving domain: " + repr(e) + "\n\n" + traceback.format_exc() | |
| def test_rfg_analysis(site_url: str, timeout_sec: float = 25.0) -> str: | |
| site_url = normalize_url(site_url) | |
| if not site_url: | |
| return "ERROR: Website URL is empty" | |
| api = DEFAULT_RFG_ANALYSIS_ENDPOINT | |
| try: | |
| resp = requests.get(api, params={"url": site_url}, timeout=timeout_sec) | |
| lines = [ | |
| f"Request: GET {api}", | |
| f"Query param url={site_url}", | |
| f"Status code: {resp.status_code}", | |
| f"Elapsed: {resp.elapsed.total_seconds():.3f} seconds", | |
| "", | |
| "=== First 2000 characters of JSON/text body ===", | |
| resp.text[:2000], | |
| ] | |
| return "\n".join(lines) | |
| except Exception as e: | |
| return "ERROR while calling RealFaviconGenerator analysis API: " + repr(e) + "\n\n" + traceback.format_exc() | |
| with gr.Blocks() as demo: | |
| gr.Markdown( | |
| """ | |
| # Minimal network test Space | |
| This Space is designed to test outbound connectivity from Hugging Face | |
| Spaces to arbitrary HTTPS endpoints, including the RealFaviconGenerator | |
| API hosted on Vercel. | |
| Use the tabs below to: | |
| - Ping any HTTPS URL (GET/HEAD) and inspect status, latency and headers. | |
| - Resolve a domain to its IP addresses. | |
| - Call the RealFaviconGenerator analysis API directly. | |
| """ | |
| ) | |
| with gr.Tab("Ping website"): | |
| url_in = gr.Textbox( | |
| label="URL", | |
| value="https://realfavicongenerator.net/api/v2", | |
| placeholder="https://example.com", | |
| ) | |
| method = gr.Dropdown( | |
| ["GET", "HEAD"], | |
| value="GET", | |
| label="HTTP method", | |
| ) | |
| timeout = gr.Slider( | |
| minimum=1, | |
| maximum=60, | |
| value=10, | |
| step=1, | |
| label="Timeout (seconds)", | |
| ) | |
| ping_out = gr.Textbox( | |
| label="Result", | |
| lines=22, | |
| show_copy_button=True, | |
| ) | |
| ping_btn = gr.Button("Ping URL") | |
| ping_btn.click(ping_url, inputs=[url_in, method, timeout], outputs=ping_out) | |
| with gr.Tab("Resolve domain"): | |
| domain_in = gr.Textbox( | |
| label="Domain or URL", | |
| value="realfavicongenerator.net", | |
| placeholder="example.com or https://example.com", | |
| ) | |
| resolve_out = gr.Textbox( | |
| label="Resolution result", | |
| lines=14, | |
| show_copy_button=True, | |
| ) | |
| resolve_btn = gr.Button("Resolve") | |
| resolve_btn.click(resolve_domain, inputs=domain_in, outputs=resolve_out) | |
| with gr.Tab("RealFaviconGenerator analysis"): | |
| site_url_in = gr.Textbox( | |
| label="Website URL to analyze", | |
| value="https://example.com", | |
| placeholder="https://example.com", | |
| ) | |
| rfg_timeout = gr.Slider( | |
| minimum=5, | |
| maximum=60, | |
| value=25, | |
| step=1, | |
| label="Timeout (seconds)", | |
| ) | |
| rfg_out = gr.Textbox( | |
| label="RFG API response / error", | |
| lines=24, | |
| show_copy_button=True, | |
| ) | |
| rfg_btn = gr.Button("Call RFG analysis API") | |
| rfg_btn.click( | |
| test_rfg_analysis, | |
| inputs=[site_url_in, rfg_timeout], | |
| outputs=rfg_out, | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch() | |