|
|
|
@@ -4,6 +4,7 @@ from typing import Any, Dict, List, Union |
|
|
|
|
|
|
|
import httpx |
|
|
|
import requests |
|
|
|
import core.helper.ssrf_proxy as ssrf_proxy |
|
|
|
from core.tools.entities.tool_bundle import ApiBasedToolBundle |
|
|
|
from core.tools.entities.tool_entities import ToolInvokeMessage |
|
|
|
from core.tools.errors import ToolProviderCredentialValidationError |
|
|
|
@@ -31,7 +32,7 @@ class ApiTool(Tool): |
|
|
|
runtime=Tool.Runtime(**meta) |
|
|
|
) |
|
|
|
|
|
|
|
def validate_credentials(self, credentials: Dict[str, Any], parameters: Dict[str, Any], format_only: bool = False) -> None: |
|
|
|
def validate_credentials(self, credentials: Dict[str, Any], parameters: Dict[str, Any], format_only: bool = False) -> str: |
|
|
|
""" |
|
|
|
validate the credentials for Api tool |
|
|
|
""" |
|
|
|
@@ -43,7 +44,7 @@ class ApiTool(Tool): |
|
|
|
|
|
|
|
response = self.do_http_request(self.api_bundle.server_url, self.api_bundle.method, headers, parameters) |
|
|
|
# validate response |
|
|
|
self.validate_and_parse_response(response) |
|
|
|
return self.validate_and_parse_response(response) |
|
|
|
|
|
|
|
def assembling_request(self, parameters: Dict[str, Any]) -> Dict[str, Any]: |
|
|
|
headers = {} |
|
|
|
@@ -201,23 +202,23 @@ class ApiTool(Tool): |
|
|
|
|
|
|
|
# do http request |
|
|
|
if method == 'get': |
|
|
|
response = httpx.get(url, params=params, headers=headers, cookies=cookies, timeout=10, follow_redirects=True) |
|
|
|
response = ssrf_proxy.get(url, params=params, headers=headers, cookies=cookies, timeout=10, follow_redirects=True) |
|
|
|
elif method == 'post': |
|
|
|
response = httpx.post(url, params=params, headers=headers, cookies=cookies, data=body, timeout=10, follow_redirects=True) |
|
|
|
response = ssrf_proxy.post(url, params=params, headers=headers, cookies=cookies, data=body, timeout=10, follow_redirects=True) |
|
|
|
elif method == 'put': |
|
|
|
response = httpx.put(url, params=params, headers=headers, cookies=cookies, data=body, timeout=10, follow_redirects=True) |
|
|
|
response = ssrf_proxy.put(url, params=params, headers=headers, cookies=cookies, data=body, timeout=10, follow_redirects=True) |
|
|
|
elif method == 'delete': |
|
|
|
""" |
|
|
|
request body data is unsupported for DELETE method in standard http protocol |
|
|
|
however, OpenAPI 3.0 supports request body data for DELETE method, so we support it here by using requests |
|
|
|
""" |
|
|
|
response = requests.delete(url, params=params, headers=headers, cookies=cookies, data=body, timeout=10, allow_redirects=True) |
|
|
|
response = ssrf_proxy.delete(url, params=params, headers=headers, cookies=cookies, data=body, timeout=10, allow_redirects=True) |
|
|
|
elif method == 'patch': |
|
|
|
response = httpx.patch(url, params=params, headers=headers, cookies=cookies, data=body, timeout=10, follow_redirects=True) |
|
|
|
response = ssrf_proxy.patch(url, params=params, headers=headers, cookies=cookies, data=body, timeout=10, follow_redirects=True) |
|
|
|
elif method == 'head': |
|
|
|
response = httpx.head(url, params=params, headers=headers, cookies=cookies, timeout=10, follow_redirects=True) |
|
|
|
response = ssrf_proxy.head(url, params=params, headers=headers, cookies=cookies, timeout=10, follow_redirects=True) |
|
|
|
elif method == 'options': |
|
|
|
response = httpx.options(url, params=params, headers=headers, cookies=cookies, timeout=10, follow_redirects=True) |
|
|
|
response = ssrf_proxy.options(url, params=params, headers=headers, cookies=cookies, timeout=10, follow_redirects=True) |
|
|
|
else: |
|
|
|
raise ValueError(f'Invalid http method {method}') |
|
|
|
|