Skip to content

Commit 6e862f8

Browse files
committed
chore: bump version to 0.8.7
1 parent 814fc53 commit 6e862f8

5 files changed

Lines changed: 60 additions & 8 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "oxapy"
3-
version = "0.8.6"
3+
version = "0.8.7"
44
edition = "2024"
55
authors = ["FITAHIANA Nomeniavo Joe <24nomeniavo@gmail.com>"]
66
repository = "https://github.com/j03-dev/oxapy"

src/request.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -370,18 +370,18 @@ impl RequestBuilder {
370370
.into_py_exception()?;
371371
request.form = parsed_multipart.fields;
372372
request.files = parsed_multipart.files;
373-
} else if content_type.starts_with("application/x-www-form-urlencoded") {
373+
} else if content_type.starts_with("application/json") {
374+
let body = String::from_utf8_lossy(&bytes).to_string();
375+
if !body.is_empty() {
376+
request.data = Some(body.clone());
377+
}
378+
} else {
374379
let form = String::from_utf8_lossy(&bytes).to_string();
375380
if !form.is_empty() {
376381
request.form = form_urlencoded::parse(form.as_bytes())
377382
.map(|(k, v)| (k.to_string(), v.to_string()))
378383
.collect();
379384
}
380-
} else {
381-
let body = String::from_utf8_lossy(&bytes).to_string();
382-
if !body.is_empty() {
383-
request.data = Some(body.clone());
384-
}
385385
}
386386
}
387387

tests/conftest.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,12 @@ def ping(_request):
6262
return {"message": "pong"}
6363

6464

65+
@post("/ping")
66+
def ping_post(request):
67+
body = request.json()
68+
return {"message": "pong", "body": body}
69+
70+
6571
@post("/echo")
6672
def echo(request):
6773
return {"echo": request.json()}
@@ -74,6 +80,18 @@ def redirect_handler(_request):
7480
return Redirect("/api/v1/ping")
7581

7682

83+
@post("/upload")
84+
def upload_handler(request):
85+
files_info = {}
86+
for name, file in request.files.items():
87+
files_info[name] = {
88+
"filename": file.name,
89+
"content_type": file.content_type,
90+
"size": len(file.content),
91+
}
92+
return {"files": files_info, "form": dict(request.form)}
93+
94+
7795
@get("/error")
7896
def error_handler(_request):
7997
return Status.INTERNAL_SERVER_ERROR
@@ -88,7 +106,9 @@ def main(static_dir: Path):
88106
.routes(
89107
[
90108
ping,
109+
ping_post,
91110
echo,
111+
upload_handler,
92112
count_handler,
93113
form,
94114
hello,

tests/test_http_server.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,13 @@ def test_ping_endpoint(oxapy_server):
88
assert res.json()["message"] == "pong"
99
assert "application/json" in res.headers["Content-Type"]
1010

11+
body = {"foo": "bar"}
12+
res = requests.post(f"{oxapy_server}/api/v1/ping", json=body)
13+
assert res.status_code == 200
14+
assert res.json()["message"] == "pong"
15+
assert res.json()["body"] == body
16+
assert "application/json" in res.headers["Content-Type"]
17+
1118

1219
def test_echo_endpoint(oxapy_server):
1320
payload = {"msg": "hello"}
@@ -71,6 +78,31 @@ def test_form(oxapy_server):
7178
assert res.json() == form_data
7279

7380

81+
def test_urlencoded_form(oxapy_server):
82+
form_data = {"username": "John Does", "email": "johndoes@email.com"}
83+
res = requests.post(
84+
f"{oxapy_server}/api/v1/form",
85+
data=form_data,
86+
headers={"Content-Type": "application/x-www-form-urlencoded"},
87+
)
88+
assert res.status_code == 200
89+
assert res.json() == form_data
90+
91+
92+
def test_multipart_file_upload(oxapy_server):
93+
res = requests.post(
94+
f"{oxapy_server}/api/v1/upload",
95+
files={"document": ("hello.txt", b"Hello, World!", "text/plain")},
96+
data={"description": "test file"},
97+
)
98+
assert res.status_code == 200
99+
data = res.json()
100+
assert data["files"]["document"]["filename"] == "hello.txt"
101+
assert data["files"]["document"]["content_type"] == "text/plain"
102+
assert data["files"]["document"]["size"] == 13
103+
assert data["form"]["description"] == "test file"
104+
105+
74106
def test_protected_route_unauthorized(oxapy_server):
75107
res = requests.get(f"{oxapy_server}/api/v1/protected")
76108
assert res.status_code == 401

0 commit comments

Comments
 (0)