---
title: "rucho"
url: "https://developer.rucho.org/apis/rucho/versions/5bdf1bcb-8db4-40f1-a293-72c7198e26c8"
---

# rucho

OpenAPI specification document.

````json
{"openapi":"3.0.3","info":{"title":"rucho","description":"Rucho - An echo server and general HTTP request inspector.","license":{"name":"MIT"},"version":"1.6.0"},"paths":{"/":{"get":{"tags":["crate::routes::core_routes"],"summary":"Serves a welcome message at the root path (`/`).","description":"# HTTP Method:\n- `GET`\n\n# Responses:\n- `200 OK`: Returns a plain text welcome message.","operationId":"root_handler","responses":{"200":{"description":"Welcome message","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/anything":{"head":{"tags":["crate::routes::core_routes"],"summary":"Echoes back details of the incoming request for any HTTP method.","description":"This endpoint is useful for debugging and understanding how requests are processed.\nIt reflects the method, path, query parameters, headers, and body of the request.\n\n# Responses:\n- `200 OK`: Successfully echoed the request details as a JSON object.\n\nNote: While this handler is registered for `/anything` and `/anything/*path`,\nthe OpenAPI documentation for `/anything/*path` is handled by `anything_path_handler`\ndue to current limitations in `utoipa` with wildcard path parameters in a single handler.","operationId":"anything_handler","parameters":[{"name":"connection","in":"query","description":"Set to `close` to force a `Connection: close` response and hang up the connection afterward (HTTP/1.1 only; ignored over HTTP/2)","required":false,"schema":{"type":"string","nullable":true}}],"requestBody":{"description":"","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}},"required":true},"responses":{"200":{"description":"Echoes request details (includes a `tls` object over HTTPS; a `connection` field when `?connection=close` is set)","content":{"application/json":{"schema":{}}}}}}},"/anything/{path:.*}":{"head":{"tags":["crate::routes::core_routes"],"summary":"**OpenAPI Documentation Handler for `/anything/*path`**.","description":"This function exists *solely* to generate the correct OpenAPI documentation\nfor requests to `/anything/{path:.*}` (e.g., `/anything/foo/bar`).\nThe actual requests to these wildcard paths are handled by `anything_handler`.\n\nThis separation is necessary due to current limitations in `utoipa` regarding\nthe generation of OpenAPI specs for handlers that serve both a fixed path and a wildcard path.\n\n# Path Parameters:\n- `path`: The subpath captured by the wildcard (e.g., \"foo/bar\").\n\n# Responses:\n- `200 OK`: Echoes request details for the subpath.\n- **Note**: This handler, if ever called directly, returns `501 Not Implemented`.","operationId":"anything_path_handler","parameters":[{"name":"path","in":"path","description":"Subpath for anything endpoint","required":true,"schema":{"type":"string"}},{"name":"path:.*","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Echoes request details for subpath","content":{"application/json":{"schema":{}}}}}}},"/base64/{encoded}":{"get":{"tags":["crate::routes::base64"],"summary":"Handles requests to the `/base64/:encoded` endpoint.","description":"Decodes the URL-path base64 string and returns a JSON payload with the\ndecoded content, a UTF-8 validity flag, and the decoded byte length.\n\n# Security\n\nInput is capped at `MAX_BASE64_INPUT_BYTES` (4096 bytes) to prevent\ndenial-of-service attacks from oversized decode operations.\n\n# Path Parameters\n\n- `encoded`: The base64-encoded string to decode. URL-safe alphabet is\npreferred; padding is optional.\n\n# Responses\n\n- `200 OK`: JSON object with `encoded`, `decoded`, `is_utf8`, `byte_length`,\nand `timing.duration_ms`.\n- `400 Bad Request`: Invalid base64 input or input exceeds the size limit.","operationId":"base64_handler","parameters":[{"name":"encoded","in":"path","description":"URL-safe base64-encoded string to decode (max 4096 bytes)","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Returns decoded content with metadata","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid base64 input or input exceeds size limit"}}}},"/brotli":{"get":{"tags":["crate::routes::encoding"],"summary":"Returns a brotli-encoded JSON echo (`Content-Encoding: br`).","operationId":"brotli_handler","responses":{"200":{"description":"brotli-encoded JSON echo of the request"}}}},"/bytes/{n}":{"get":{"tags":["crate::routes::bytes"],"summary":"Returns `n` random bytes as the response body.","description":"Response headers: `Content-Type: application/octet-stream`, `Content-Length: n`.\n`n` is capped at `MAX_BYTES_RESPONSE_SIZE` (10 MiB); larger values return 400.\n`n = 0` returns an empty 200 OK.\n\nThe body is filled via `rand::thread_rng().fill_bytes(&mut buf[..])` for\nmaximum-entropy payloads (useful for verifying binary integrity through a\nproxy, since any tampering is observable).","operationId":"bytes_handler","parameters":[{"name":"n","in":"path","description":"Number of random bytes to return (max 10485760)","required":true,"schema":{"type":"integer","minimum":0}}],"responses":{"200":{"description":"Returns n random bytes as application/octet-stream","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"n exceeds MAX_BYTES_RESPONSE_SIZE"}}}},"/cache":{"get":{"tags":["crate::routes::cache"],"summary":"`/cache` — conditional-request endpoint.","description":"Returns `304 Not Modified` if the request carries `If-None-Match` or\n`If-Modified-Since`; otherwise `200` with `ETag` + `Last-Modified` headers\nand a JSON echo, so a client can revalidate on the next request.","operationId":"cache_handler","responses":{"200":{"description":"Cacheable JSON echo with ETag + Last-Modified"},"304":{"description":"Not Modified — conditional request matched"}}}},"/cache/{n}":{"get":{"tags":["crate::routes::cache"],"summary":"`/cache/:n` — returns `200` with `Cache-Control: public, max-age=n`.","operationId":"cache_seconds_handler","parameters":[{"name":"n","in":"path","description":"max-age in seconds","required":true,"schema":{"type":"integer","format":"int64","minimum":0}}],"responses":{"200":{"description":"JSON echo with Cache-Control: public, max-age=n"}}}},"/cookies":{"get":{"tags":["crate::routes::cookies"],"summary":"Returns all cookies from the request as JSON.","description":"Parses the `Cookie` header and returns a JSON object with a `cookies` key\ncontaining a map of cookie name-value pairs.\n\n# Example Response\n\n```json\n{ \"cookies\": { \"session\": \"abc123\", \"theme\": \"dark\" } }\n```","operationId":"cookies_handler","responses":{"200":{"description":"Returns all cookies from the request","content":{"application/json":{"schema":{}}}}}},"delete":{"tags":["crate::routes::cookies"],"summary":"Deletes cookies via the `DELETE` method on `/cookies` — RESTful symmetry with","description":"`GET /cookies/delete`. Each query-parameter name expires the matching cookie\n(`Max-Age=0`), and the response is a `302` redirect to `/cookies`.\n\n# Example\n\n`DELETE /cookies?foo&theme` expires both cookies and redirects.","operationId":"delete_cookies_method_handler","parameters":[{"name":"","in":"query","description":"Cookie names to delete","required":true,"schema":{"type":"object","additionalProperties":{"type":"string"}}}],"responses":{"302":{"description":"Redirects to /cookies after deleting cookies"}}}},"/cookies/delete":{"get":{"tags":["crate::routes::cookies"],"summary":"Deletes cookies by setting `Max-Age=0` and redirects to `/cookies`.","description":"Each query parameter name is used to expire the corresponding cookie.\nThe value of the query parameter is ignored.\n\n# Example\n\n`GET /cookies/delete?foo&theme` expires both cookies and redirects.","operationId":"delete_cookies_handler","parameters":[{"name":"","in":"query","description":"Cookie names to delete","required":true,"schema":{"type":"object","additionalProperties":{"type":"string"}}}],"responses":{"302":{"description":"Redirects to /cookies after deleting cookies"}}}},"/cookies/set":{"get":{"tags":["crate::routes::cookies"],"summary":"Sets cookies from query parameters and redirects to `/cookies`.","description":"Each non-reserved query parameter becomes a `Set-Cookie` response header.\nReserved keys add attributes applied to every cookie set in the request:\n`secure`, `httponly`, `samesite=<Strict|Lax|None>`, `max_age=<seconds>`,\n`path=<path>` (default `/`), `domain=<domain>`. After setting the cookies,\nresponds with a 302 redirect to `/cookies` so the client can see the result.\n\n# Example\n\n`GET /cookies/set?session=abc&secure&httponly&samesite=Strict&max_age=3600`\nsets `session=abc; Path=/; Max-Age=3600; SameSite=Strict; Secure; HttpOnly`.","operationId":"set_cookies_handler","parameters":[{"name":"","in":"query","description":"Cookie name=value pairs, plus optional attribute flags: secure, httponly, samesite, max_age, path, domain","required":true,"schema":{"type":"object","additionalProperties":{"type":"string"}}}],"responses":{"302":{"description":"Redirects to /cookies after setting cookies"}}}},"/deflate":{"get":{"tags":["crate::routes::encoding"],"summary":"Returns a deflate-encoded JSON echo (`Content-Encoding: deflate`).","description":"Uses the zlib container (matching httpbin's `zlib.compress`), which is what\n`Content-Encoding: deflate` means in practice for real-world clients.","operationId":"deflate_handler","responses":{"200":{"description":"deflate-encoded JSON echo of the request"}}}},"/delay/{n}":{"head":{"tags":["crate::routes::delay"],"summary":"Handles requests to the `/delay/:n` endpoint.","description":"Introduces a delay of `n` seconds before sending a response.\nThe delay duration `n` is extracted from the path.\n\n# Security\n\nThe maximum delay is capped at `MAX_DELAY_SECONDS` (300 seconds) to prevent\ndenial-of-service attacks where malicious requests could hold connections open indefinitely.","operationId":"delay_handler","parameters":[{"name":"n","in":"path","description":"Number of seconds to delay the response (max 300)","required":true,"schema":{"type":"integer","format":"int64","minimum":0}}],"responses":{"200":{"description":"Responds after the specified delay","content":{"text/plain":{"schema":{"type":"string"}}}},"400":{"description":"Delay exceeds maximum allowed value"}}}},"/delete":{"delete":{"tags":["crate::routes::core_routes"],"summary":"Handles DELETE requests to `/delete`.","description":"Echoes back the request's method and headers. If a JSON body is provided,\nit will also be echoed. Otherwise, the body in the response will be `null`.\n\n# HTTP Method:\n- `DELETE`\n\n# Request Body:\n- `Payload` (optional): A generic JSON object.\n\n# Responses:\n- `200 OK`: Returns a JSON object containing method, headers, and body (if provided).","operationId":"delete_handler","requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Payload"}],"nullable":true}}},"required":false},"responses":{"200":{"description":"Echoes request details, body is null if not provided","content":{"application/json":{"schema":{}}}}}}},"/drip":{"get":{"tags":["crate::routes::drip"],"summary":"Streams `numbytes` bytes of `*` over `duration` seconds.","operationId":"drip_handler","parameters":[{"name":"numbytes","in":"query","description":"Total bytes to emit (default 10, max 10000)","required":false,"schema":{"type":"integer","nullable":true,"minimum":0}},{"name":"duration","in":"query","description":"Total stream duration in seconds (default 2, max 300)","required":false,"schema":{"type":"integer","format":"int64","nullable":true,"minimum":0}},{"name":"code","in":"query","description":"Status code on the response (default 200)","required":false,"schema":{"type":"integer","format":"int32","nullable":true,"minimum":0}},{"name":"delay","in":"query","description":"Initial delay before first byte in seconds (default 0, max 300)","required":false,"schema":{"type":"integer","format":"int64","nullable":true,"minimum":0}}],"responses":{"200":{"description":"Bytes streamed slowly","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Parameter exceeds cap or invalid status code"}}}},"/endpoints":{"get":{"tags":["crate::routes::core_routes"],"summary":"Lists all available API endpoints provided by this server.","description":"Returns a JSON array of `EndpointInfo` objects, each describing an endpoint's\npath, HTTP method, and a brief description.\n\n# HTTP Method:\n- `GET`\n\n# Responses:\n- `200 OK`: Successfully returns the list of endpoints.\n- `500 Internal Server Error`: If there's an issue serializing the endpoint data.","operationId":"endpoints_handler","responses":{"200":{"description":"Lists all available API endpoints","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EndpointInfo"}}}}}}}},"/get":{"get":{"tags":["crate::routes::core_routes"],"summary":"Handles GET requests to `/get`.","description":"Echoes back the request's method and headers as a JSON object.\n\n# HTTP Method:\n- `GET`\n\n# Responses:\n- `200 OK`: Returns a JSON object containing the method and headers.","operationId":"get_handler","responses":{"200":{"description":"Echoes request details (includes a `tls` object over HTTPS)","content":{"application/json":{"schema":{}}}}}},"head":{"tags":["crate::routes::core_routes"],"summary":"Handles HEAD requests to `/get`.","description":"Responds with the same headers as a GET request to `/get`, but with no body.\nThis is typically used to check if a resource exists or to get its metadata\nwithout transferring the entire content.\n\n# HTTP Method:\n- `HEAD`\n\n# Responses:\n- `200 OK`: Returns an empty body with appropriate headers.","operationId":"head_handler","responses":{"200":{"description":"Responds with headers for GET query"}}}},"/gzip":{"get":{"tags":["crate::routes::encoding"],"summary":"Returns a gzip-encoded JSON echo of the request (`Content-Encoding: gzip`).","operationId":"gzip_handler","responses":{"200":{"description":"gzip-encoded JSON echo of the request"}}}},"/headers":{"get":{"tags":["crate::routes::core_routes"],"summary":"Returns all request headers as a JSON object.","description":"Useful for debugging what headers are being sent by the client,\nincluding auth tokens, proxy headers, and custom headers.\n\n# HTTP Method:\n- `GET`\n\n# Responses:\n- `200 OK`: Returns a JSON object containing all request headers.","operationId":"headers_handler","responses":{"200":{"description":"Returns all request headers","content":{"application/json":{"schema":{}}}}}}},"/healthz":{"get":{"tags":["crate::routes::healthz"],"summary":"Handles requests to the `/healthz` endpoint.","description":"Returns an HTTP 200 OK status and the plain text \"OK\".","operationId":"healthz_handler","responses":{"200":{"description":"Health check successful","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/html":{"get":{"tags":["crate::routes::content_types"],"summary":"Returns a small sample HTML document as `text/html; charset=utf-8`.","description":"Deliberately non-JSON — a controllable upstream for testing how a gateway\nhandles `text/html` responses.","operationId":"html_handler","responses":{"200":{"description":"A sample HTML document","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/image/{format}":{"get":{"tags":["crate::routes::image"],"summary":"Returns a small sample image in the requested `format`.","description":"Supported: `png`, `jpeg` (alias `jpg`), `svg`, `webp` — any other value\nreturns 400. Each returns a tiny fixed image with the matching\n`Content-Type`, as a controllable upstream for testing gateway handling of\nbinary/image bodies.","operationId":"image_handler","parameters":[{"name":"format","in":"path","description":"Image format: png, jpeg, svg, or webp","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"A sample image in the requested format"},"400":{"description":"Unsupported image format"}}}},"/ip":{"get":{"tags":["crate::routes::core_routes"],"summary":"Returns the client's IP address.","description":"Extracts the client IP from request headers. Checks X-Forwarded-For first\n(for proxied requests), then X-Real-IP as a fallback.\n\n# HTTP Method:\n- `GET`\n\n# Responses:\n- `200 OK`: Returns a JSON object containing the client's origin IP.","operationId":"ip_handler","responses":{"200":{"description":"Returns the client's IP address","content":{"application/json":{"schema":{}}}}}}},"/metrics":{"get":{"tags":["crate::routes::metrics"],"summary":"Handler for the `/metrics` endpoint.","description":"Returns a JSON object containing:\n- `all_time`: Total requests, successes, failures, and per-endpoint hits since server start\n- `last_hour`: Same metrics but only for the last 60 minutes (rolling window)\n\n# Example Response\n\n```json\n{\n\"all_time\": {\n\"total_requests\": 1000,\n\"successes\": 950,\n\"failures\": 50,\n\"endpoint_hits\": {\n\"/get\": 500,\n\"/post\": 300,\n\"/status/:code\": 200\n}\n},\n\"last_hour\": {\n\"total_requests\": 100,\n\"successes\": 95,\n\"failures\": 5,\n\"endpoint_hits\": {\n\"/get\": 50,\n\"/post\": 30,\n\"/status/:code\": 20\n}\n}\n}\n```","operationId":"get_metrics","responses":{"200":{"description":"Request statistics as JSON: `all_time` totals plus a rolling `last_hour` window, each with total/success/failure counts and per-endpoint hits. Only mounted when `metrics_enabled` is set — otherwise the route returns 404.","content":{"application/json":{"schema":{}}}}}}},"/options":{"options":{"tags":["crate::routes::core_routes"],"summary":"Handles OPTIONS requests to `/options`.","description":"Responds with the allowed HTTP methods for this server in the `Allow` header.\nThe body of the response is empty.\n\n# HTTP Method:\n- `OPTIONS`\n\n# Responses:\n- `204 No Content`: Returns an empty body with the `Allow` header set to\n\"GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD\".","operationId":"options_handler","responses":{"204":{"description":"No content, Allow header lists allowed methods"}}}},"/patch":{"patch":{"tags":["crate::routes::core_routes"],"summary":"Handles PATCH requests to `/patch`.","description":"Echoes back the request's method, headers, and the parsed JSON body.\nExpects a JSON request body.\n\n# HTTP Method:\n- `PATCH`\n\n# Request Body:\n- `Payload`: A generic JSON object.\n\n# Responses:\n- `200 OK`: Returns a JSON object containing method, headers, and parsed body.\n- `400 Bad Request`: If the request body is not valid JSON.","operationId":"patch_handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Payload"}}},"required":true},"responses":{"200":{"description":"Echoes request details","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid JSON payload"}}}},"/post":{"post":{"tags":["crate::routes::core_routes"],"summary":"Handles POST requests to `/post`.","description":"Echoes back the request's method, headers, and the parsed JSON body.\nExpects a JSON request body.\n\n# HTTP Method:\n- `POST`\n\n# Request Body:\n- `Payload`: A generic JSON object.\n\n# Responses:\n- `200 OK`: Returns a JSON object containing method, headers, and parsed body.\n- `400 Bad Request`: If the request body is not valid JSON.","operationId":"post_handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Payload"}}},"required":true},"responses":{"200":{"description":"Echoes request details","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid JSON payload"}}}},"/put":{"put":{"tags":["crate::routes::core_routes"],"summary":"Handles PUT requests to `/put`.","description":"Echoes back the request's method, headers, and the parsed JSON body.\nExpects a JSON request body.\n\n# HTTP Method:\n- `PUT`\n\n# Request Body:\n- `Payload`: A generic JSON object.\n\n# Responses:\n- `200 OK`: Returns a JSON object containing method, headers, and parsed body.\n- `400 Bad Request`: If the request body is not valid JSON.","operationId":"put_handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Payload"}}},"required":true},"responses":{"200":{"description":"Echoes request details","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid JSON payload"}}}},"/range/{n}":{"get":{"tags":["crate::routes::range"],"summary":"Returns `n` bytes of deterministic content with range-request support.","description":"Without a `Range` header: `200 OK`, full body, `Accept-Ranges: bytes`.\nWith a satisfiable `Range`: `206 Partial Content` + `Content-Range`.\nWith an unsatisfiable `Range`: `416 Range Not Satisfiable` + `Content-Range: bytes */n`.\n`n` is capped at `MAX_BYTES_RESPONSE_SIZE` (10 MiB); larger values return 400.","operationId":"range_handler","parameters":[{"name":"n","in":"path","description":"Total number of bytes the resource represents (max 10485760)","required":true,"schema":{"type":"integer","minimum":0}}],"responses":{"200":{"description":"Full body (no Range header)","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"206":{"description":"Partial body for a satisfiable Range","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"n exceeds MAX_BYTES_RESPONSE_SIZE"},"416":{"description":"Range not satisfiable"}}}},"/redirect/{n}":{"head":{"tags":["crate::routes::redirect"],"summary":"Handles requests to the `/redirect/:n` endpoint.","description":"Returns a 302 redirect chain that decrements `n` on each hop.\nWhen `n` reaches 1, redirects to `/get` as the final destination.\nWhen `n` is 0, returns 200 directly (redirect complete).\n\n# Security\n\nThe maximum number of hops is capped at `MAX_REDIRECT_HOPS` (20) to prevent\nabuse through excessively long redirect chains.","operationId":"redirect_handler","parameters":[{"name":"n","in":"path","description":"Number of redirects remaining (max 20)","required":true,"schema":{"type":"integer","format":"int32","minimum":0}}],"responses":{"200":{"description":"Redirect complete (when n=0)","content":{"text/plain":{"schema":{"type":"string"}}}},"302":{"description":"Redirects to /redirect/{n-1} or /get when n=1"},"400":{"description":"Redirect count exceeds maximum allowed value"}}}},"/response-headers":{"get":{"tags":["crate::routes::response_headers"],"summary":"Echoes each query parameter as a response header and in the JSON body.","description":"`GET /response-headers?x-rate-limit=100&cache-control=no-store` returns:\n- Response headers `x-rate-limit: 100` and `cache-control: no-store`\n- JSON body `{\"x-rate-limit\": \"100\", \"cache-control\": \"no-store\"}`\n\nDuplicate keys emit multiple response headers (HTTP's repeat-header model)\nand collapse to a JSON array in the body. Invalid header names or values\nreturn 400.\n\nUser-supplied headers replace any defaults — setting `content-type`\noverrides the default `application/json` (body remains JSON regardless;\nthe mismatch is intentional for plugin-testing scenarios).","operationId":"response_headers_handler","responses":{"200":{"description":"Echoes query params as response headers and a JSON body"},"400":{"description":"Invalid header name or value"}}}},"/status/{code}":{"head":{"tags":["crate::routes::core_routes"],"summary":"Responds with the HTTP status code specified in the path.","description":"This handler allows testing of how a client handles different HTTP status codes.\nIt accepts any HTTP method.\n\n# Path Parameters:\n- `code`: The HTTP status code to return (e.g., 200, 404, 500).\n\n# Responses:\n- Returns the status code specified by the `code` path parameter.\n- If an invalid `code` is provided (e.g., not a number or out of valid range),\nit defaults to `400 Bad Request`.","operationId":"status_handler","parameters":[{"name":"code","in":"path","description":"HTTP status code to return","required":true,"schema":{"type":"integer","format":"int32","minimum":0}}],"responses":{"200":{"description":"Returns the specified status code"},"400":{"description":"Invalid status code provided"}}}},"/user-agent":{"get":{"tags":["crate::routes::core_routes"],"summary":"Returns the User-Agent header from the request.","description":"Extracts and returns the User-Agent header value. Useful for testing\nwhat user agent string your client is sending.\n\n# HTTP Method:\n- `GET`\n\n# Responses:\n- `200 OK`: Returns a JSON object containing the User-Agent string.","operationId":"user_agent_handler","responses":{"200":{"description":"Returns the User-Agent header","content":{"application/json":{"schema":{}}}}}}},"/uuid":{"get":{"tags":["crate::routes::core_routes"],"summary":"Returns a randomly generated UUID v4.","description":"Generates a new random UUID (Universally Unique Identifier) using the v4 algorithm.\nUseful for generating unique identifiers for testing purposes.\n\n# HTTP Method:\n- `GET`\n\n# Responses:\n- `200 OK`: Returns a JSON object containing the generated UUID.","operationId":"uuid_handler","responses":{"200":{"description":"Returns a randomly generated UUID","content":{"application/json":{"schema":{}}}}}}},"/xml":{"get":{"tags":["crate::routes::content_types"],"summary":"Returns a small sample XML document as `application/xml`.","description":"Deliberately non-JSON — a controllable upstream for testing how a gateway\nhandles `application/xml` responses (e.g. content-type-aware plugins).","operationId":"xml_handler","responses":{"200":{"description":"A sample XML document","content":{"application/xml":{"schema":{"type":"string"}}}}}}}},"components":{"schemas":{"EndpointInfo":{"type":"object","description":"Represents information about an API endpoint.","required":["path","method","description"],"properties":{"description":{"type":"string","description":"A brief description of the endpoint's purpose.","example":"Echoes request details for GET."},"method":{"type":"string","description":"The HTTP method of the endpoint (e.g., \"GET\").","example":"GET"},"path":{"type":"string","description":"The path of the endpoint (e.g., \"/get\").","example":"/get"}}},"Payload":{"description":"Request payload wrapper for POST, PUT, PATCH, and DELETE handlers.\n\nThis newtype wraps a `serde_json::Value` to accept arbitrary JSON bodies\nin requests that support request bodies."}}},"tags":[{"name":"Rucho","description":"Rucho API"}],"servers":[{"url":"https://rucho.org","description":"Production (EKS us-east-2, behind Kong)"}]}
````
