Merge branch 'dev' into fix/api_settings
This commit is contained in:
commit
ac0d755a62
3 changed files with 97 additions and 12 deletions
|
|
@ -15,10 +15,25 @@ import shlex
|
||||||
from collections import OrderedDict, namedtuple
|
from collections import OrderedDict, namedtuple
|
||||||
from http.cookies import SimpleCookie
|
from http.cookies import SimpleCookie
|
||||||
|
|
||||||
from uncurl.api import parser # type: ignore
|
ParsedArgs = namedtuple(
|
||||||
|
"ParsedContext",
|
||||||
parser.add_argument("-x", "--proxy", default={})
|
[
|
||||||
parser.add_argument("-U", "--proxy-user", default="")
|
"command",
|
||||||
|
"url",
|
||||||
|
"data",
|
||||||
|
"data_binary",
|
||||||
|
"method",
|
||||||
|
"headers",
|
||||||
|
"compressed",
|
||||||
|
"insecure",
|
||||||
|
"user",
|
||||||
|
"include",
|
||||||
|
"silent",
|
||||||
|
"proxy",
|
||||||
|
"proxy_user",
|
||||||
|
"cookies",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
ParsedContext = namedtuple("ParsedContext", ["method", "url", "data", "headers", "cookies", "verify", "auth", "proxy"])
|
ParsedContext = namedtuple("ParsedContext", ["method", "url", "data", "headers", "cookies", "verify", "auth", "proxy"])
|
||||||
|
|
||||||
|
|
@ -27,24 +42,89 @@ def normalize_newlines(multiline_text):
|
||||||
return multiline_text.replace(" \\\n", " ")
|
return multiline_text.replace(" \\\n", " ")
|
||||||
|
|
||||||
|
|
||||||
|
def parse_curl_command(curl_command):
|
||||||
|
tokens = shlex.split(normalize_newlines(curl_command))
|
||||||
|
tokens = [token for token in tokens if token and token != " "]
|
||||||
|
if "curl" not in tokens[0]:
|
||||||
|
raise ValueError("Invalid curl command")
|
||||||
|
args_template = {
|
||||||
|
"command": None,
|
||||||
|
"url": None,
|
||||||
|
"data": None,
|
||||||
|
"data_binary": None,
|
||||||
|
"method": "get",
|
||||||
|
"headers": [],
|
||||||
|
"compressed": False,
|
||||||
|
"insecure": False,
|
||||||
|
"user": (),
|
||||||
|
"include": False,
|
||||||
|
"silent": False,
|
||||||
|
"proxy": None,
|
||||||
|
"proxy_user": None,
|
||||||
|
"cookies": {},
|
||||||
|
}
|
||||||
|
args = args_template.copy()
|
||||||
|
|
||||||
|
i = 0
|
||||||
|
while i < len(tokens):
|
||||||
|
token = tokens[i]
|
||||||
|
if token == "-X":
|
||||||
|
i += 1
|
||||||
|
args["method"] = tokens[i].lower()
|
||||||
|
elif token in ("-d", "--data"):
|
||||||
|
i += 1
|
||||||
|
args["data"] = tokens[i]
|
||||||
|
args["method"] = "post"
|
||||||
|
elif token in ("-b", "--data-binary", "--data-raw"):
|
||||||
|
i += 1
|
||||||
|
args["data_binary"] = tokens[i]
|
||||||
|
args["method"] = "post"
|
||||||
|
elif token in ("-H", "--header"):
|
||||||
|
i += 1
|
||||||
|
args["headers"].append(tokens[i])
|
||||||
|
elif token == "--compressed":
|
||||||
|
args["compressed"] = True
|
||||||
|
elif token in ("-k", "--insecure"):
|
||||||
|
args["insecure"] = True
|
||||||
|
elif token in ("-u", "--user"):
|
||||||
|
i += 1
|
||||||
|
args["user"] = tuple(tokens[i].split(":"))
|
||||||
|
elif token in ("-I", "--include"):
|
||||||
|
args["include"] = True
|
||||||
|
elif token in ("-s", "--silent"):
|
||||||
|
args["silent"] = True
|
||||||
|
elif token in ("-x", "--proxy"):
|
||||||
|
i += 1
|
||||||
|
args["proxy"] = tokens[i]
|
||||||
|
elif token in ("-U", "--proxy-user"):
|
||||||
|
i += 1
|
||||||
|
args["proxy_user"] = tokens[i]
|
||||||
|
elif not token.startswith("-"):
|
||||||
|
if args["command"] is None:
|
||||||
|
args["command"] = token
|
||||||
|
else:
|
||||||
|
args["url"] = token
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
return ParsedArgs(**args)
|
||||||
|
|
||||||
|
|
||||||
def parse_context(curl_command):
|
def parse_context(curl_command):
|
||||||
method = "get"
|
method = "get"
|
||||||
|
|
||||||
tokens = shlex.split(normalize_newlines(curl_command))
|
parsed_args: ParsedArgs = parse_curl_command(curl_command)
|
||||||
tokens = [token for token in tokens if token and token != " "]
|
|
||||||
parsed_args = parser.parse_args(tokens)
|
|
||||||
|
|
||||||
post_data = parsed_args.data or parsed_args.data_binary
|
post_data = parsed_args.data or parsed_args.data_binary
|
||||||
if post_data:
|
if post_data:
|
||||||
method = "post"
|
method = "post"
|
||||||
|
|
||||||
if parsed_args.X:
|
if parsed_args.method:
|
||||||
method = parsed_args.X.lower()
|
method = parsed_args.method.lower()
|
||||||
|
|
||||||
cookie_dict = OrderedDict()
|
cookie_dict = OrderedDict()
|
||||||
quoted_headers = OrderedDict()
|
quoted_headers = OrderedDict()
|
||||||
|
|
||||||
for curl_header in parsed_args.header:
|
for curl_header in parsed_args.headers:
|
||||||
if curl_header.startswith(":"):
|
if curl_header.startswith(":"):
|
||||||
occurrence = [m.start() for m in re.finditer(":", curl_header)]
|
occurrence = [m.start() for m in re.finditer(":", curl_header)]
|
||||||
header_key, header_value = curl_header[: occurrence[1]], curl_header[occurrence[1] + 1 :]
|
header_key, header_value = curl_header[: occurrence[1]], curl_header[occurrence[1] + 1 :]
|
||||||
|
|
|
||||||
|
|
@ -59,6 +59,7 @@ const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
|
||||||
variant,
|
variant,
|
||||||
size,
|
size,
|
||||||
loading,
|
loading,
|
||||||
|
type,
|
||||||
disabled,
|
disabled,
|
||||||
asChild = false,
|
asChild = false,
|
||||||
children,
|
children,
|
||||||
|
|
@ -76,6 +77,7 @@ const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
|
||||||
<Comp
|
<Comp
|
||||||
className={cn(buttonVariants({ variant, size, className }))}
|
className={cn(buttonVariants({ variant, size, className }))}
|
||||||
disabled={loading || disabled}
|
disabled={loading || disabled}
|
||||||
|
{...(asChild ? {} : { type: type || "button" })}
|
||||||
ref={ref}
|
ref={ref}
|
||||||
{...props}
|
{...props}
|
||||||
>
|
>
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@ import { chatViewProps } from "../../../../types/components";
|
||||||
import { classNames } from "../../../../utils/utils";
|
import { classNames } from "../../../../utils/utils";
|
||||||
import ChatInput from "./chatInput";
|
import ChatInput from "./chatInput";
|
||||||
import ChatMessage from "./chatMessage";
|
import ChatMessage from "./chatMessage";
|
||||||
|
import { Button } from "../../../../components/ui/button";
|
||||||
|
|
||||||
export default function ChatView({
|
export default function ChatView({
|
||||||
sendMessage,
|
sendMessage,
|
||||||
|
|
@ -166,8 +167,10 @@ export default function ChatView({
|
||||||
<div className="eraser-column-arrangement">
|
<div className="eraser-column-arrangement">
|
||||||
<div className="eraser-size">
|
<div className="eraser-size">
|
||||||
<div className="eraser-position">
|
<div className="eraser-position">
|
||||||
<button
|
<Button
|
||||||
className="flex gap-1"
|
className="flex gap-1"
|
||||||
|
size="none"
|
||||||
|
variant="none"
|
||||||
onClick={() => handleSelectChange("builds")}
|
onClick={() => handleSelectChange("builds")}
|
||||||
>
|
>
|
||||||
<IconComponent
|
<IconComponent
|
||||||
|
|
@ -178,7 +181,7 @@ export default function ChatView({
|
||||||
)}
|
)}
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
/>
|
/>
|
||||||
</button>
|
</Button>
|
||||||
{/* <Select
|
{/* <Select
|
||||||
onValueChange={handleSelectChange}
|
onValueChange={handleSelectChange}
|
||||||
value=""
|
value=""
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue