ferroapi 0.0.1__tar.gz → 0.0.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ferroapi-0.0.1 → ferroapi-0.0.2}/Cargo.lock +4 -4
- {ferroapi-0.0.1 → ferroapi-0.0.2}/Cargo.toml +4 -4
- {ferroapi-0.0.1 → ferroapi-0.0.2}/PKG-INFO +1 -1
- {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-core/src/lib.rs +20 -7
- {ferroapi-0.0.1 → ferroapi-0.0.2}/LICENSE +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/README.md +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-core/Cargo.toml +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-core/src/queue.rs +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-core/src/request.rs +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-core/src/websocket.rs +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-http/Cargo.toml +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-http/benches/http.rs +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-http/src/form.rs +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-http/src/lib.rs +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-http/src/middleware.rs +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-http/src/queue.rs +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-http/src/ranges.rs +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-http/src/reply.rs +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-http/src/server.rs +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-http/src/statics.rs +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-python/Cargo.toml +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-python/src/lib.rs +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-router/Cargo.toml +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-router/benches/lookup.rs +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-router/src/lib.rs +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/pyproject.toml +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/__init__.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/_core.pyi +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/annotations.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/applications.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/background.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/concurrency.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/datastructures.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/dependencies.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/encoders.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/exceptions.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/middleware/__init__.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/middleware/_native.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/middleware/cors.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/middleware/gzip.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/middleware/trustedhost.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/openapi/__init__.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/openapi/docs.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/openapi/forms.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/openapi/utils.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/param_models.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/params.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/py.typed +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/requests.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/responses.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/routing.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/security/__init__.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/security/api_key.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/security/base.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/security/http.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/security/oauth2.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/security/open_id_connect_url.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/security/utils.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/solving.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/sse.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/staticfiles.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/status.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/testclient.py +0 -0
- {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/websockets.py +0 -0
|
@@ -300,7 +300,7 @@ checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223"
|
|
|
300
300
|
|
|
301
301
|
[[package]]
|
|
302
302
|
name = "ferroapi-core"
|
|
303
|
-
version = "0.0.
|
|
303
|
+
version = "0.0.2"
|
|
304
304
|
dependencies = [
|
|
305
305
|
"bytes",
|
|
306
306
|
"ferroapi-http",
|
|
@@ -321,7 +321,7 @@ dependencies = [
|
|
|
321
321
|
|
|
322
322
|
[[package]]
|
|
323
323
|
name = "ferroapi-http"
|
|
324
|
-
version = "0.0.
|
|
324
|
+
version = "0.0.2"
|
|
325
325
|
dependencies = [
|
|
326
326
|
"bytes",
|
|
327
327
|
"codspeed-divan-compat",
|
|
@@ -346,7 +346,7 @@ dependencies = [
|
|
|
346
346
|
|
|
347
347
|
[[package]]
|
|
348
348
|
name = "ferroapi-python"
|
|
349
|
-
version = "0.0.
|
|
349
|
+
version = "0.0.2"
|
|
350
350
|
dependencies = [
|
|
351
351
|
"bytes",
|
|
352
352
|
"ferroapi-core",
|
|
@@ -358,7 +358,7 @@ dependencies = [
|
|
|
358
358
|
|
|
359
359
|
[[package]]
|
|
360
360
|
name = "ferroapi-router"
|
|
361
|
-
version = "0.0.
|
|
361
|
+
version = "0.0.2"
|
|
362
362
|
dependencies = [
|
|
363
363
|
"codspeed-divan-compat",
|
|
364
364
|
]
|
|
@@ -3,16 +3,16 @@ resolver = "2"
|
|
|
3
3
|
members = ["crates/ferroapi-http", "crates/ferroapi-router", "crates/ferroapi-core", "crates/ferroapi-python"]
|
|
4
4
|
|
|
5
5
|
[workspace.package]
|
|
6
|
-
version = "0.0.
|
|
6
|
+
version = "0.0.2"
|
|
7
7
|
edition = "2024"
|
|
8
8
|
rust-version = "1.85"
|
|
9
9
|
license = "MIT"
|
|
10
10
|
repository = "https://github.com/Kludex/ferroapi"
|
|
11
11
|
|
|
12
12
|
[workspace.dependencies]
|
|
13
|
-
ferroapi-http = { path = "crates/ferroapi-http", version = "=0.0.
|
|
14
|
-
ferroapi-core = { path = "crates/ferroapi-core", version = "=0.0.
|
|
15
|
-
ferroapi-router = { path = "crates/ferroapi-router", version = "=0.0.
|
|
13
|
+
ferroapi-http = { path = "crates/ferroapi-http", version = "=0.0.2" }
|
|
14
|
+
ferroapi-core = { path = "crates/ferroapi-core", version = "=0.0.2" }
|
|
15
|
+
ferroapi-router = { path = "crates/ferroapi-router", version = "=0.0.2" }
|
|
16
16
|
bytes = "1"
|
|
17
17
|
http-body-util = "0.1"
|
|
18
18
|
hyper = { version = "1", features = ["http1", "http2", "server"] }
|
|
@@ -387,7 +387,7 @@ impl App {
|
|
|
387
387
|
.push(Box::new(move |py| start(py, &plan.plan, &spawn, raw, &started)));
|
|
388
388
|
let guard = Abandon {
|
|
389
389
|
task,
|
|
390
|
-
queue: self.queue.clone(),
|
|
390
|
+
queue: Some(self.queue.clone()),
|
|
391
391
|
};
|
|
392
392
|
let reply = receiver
|
|
393
393
|
.await
|
|
@@ -456,19 +456,22 @@ fn too_large() -> Reply {
|
|
|
456
456
|
/// Cancels the endpoint's task when hyper drops the request before it was answered: the client went away.
|
|
457
457
|
struct Abandon {
|
|
458
458
|
task: Arc<Mutex<Option<Py<PyAny>>>>,
|
|
459
|
-
queue: Arc<Queue
|
|
459
|
+
queue: Option<Arc<Queue>>,
|
|
460
460
|
}
|
|
461
461
|
|
|
462
462
|
impl Abandon {
|
|
463
|
-
fn disarm(self) {
|
|
464
|
-
|
|
463
|
+
fn disarm(mut self) {
|
|
464
|
+
self.queue = None;
|
|
465
465
|
}
|
|
466
466
|
}
|
|
467
467
|
|
|
468
468
|
impl Drop for Abandon {
|
|
469
469
|
fn drop(&mut self) {
|
|
470
|
+
let Some(queue) = self.queue.take() else {
|
|
471
|
+
return;
|
|
472
|
+
};
|
|
470
473
|
let task = self.task.clone();
|
|
471
|
-
|
|
474
|
+
queue.push(Box::new(move |py| {
|
|
472
475
|
let task = task.lock().unwrap_or_else(std::sync::PoisonError::into_inner).take();
|
|
473
476
|
if let Some(Err(err)) = task.map(|task| task.call_method0(py, intern!(py, "cancel"))) {
|
|
474
477
|
report(py, err, None);
|
|
@@ -585,12 +588,16 @@ impl App {
|
|
|
585
588
|
}
|
|
586
589
|
}
|
|
587
590
|
|
|
588
|
-
fn start(py: Python<'_>, plan: &Py<PyAny>, spawn: &Py<PyAny>, raw: RawRequest, task: &Mutex<Option<Py<PyAny
|
|
591
|
+
fn start(py: Python<'_>, plan: &Py<PyAny>, spawn: &Py<PyAny>, raw: RawRequest, task: &Arc<Mutex<Option<Py<PyAny>>>>) {
|
|
589
592
|
let raw = match Py::new(py, raw) {
|
|
590
593
|
Ok(raw) => raw,
|
|
591
594
|
Err(err) => return report(py, err, Some(plan.bind(py))),
|
|
592
595
|
};
|
|
593
|
-
let
|
|
596
|
+
let done = Done {
|
|
597
|
+
raw: raw.clone_ref(py),
|
|
598
|
+
task: task.clone(),
|
|
599
|
+
};
|
|
600
|
+
let started = Py::new(py, done).and_then(|done| {
|
|
594
601
|
let coroutine = plan.call1(py, (raw.clone_ref(py),))?;
|
|
595
602
|
spawn.call1(py, (coroutine, done))
|
|
596
603
|
});
|
|
@@ -607,11 +614,17 @@ fn start(py: Python<'_>, plan: &Py<PyAny>, spawn: &Py<PyAny>, raw: RawRequest, t
|
|
|
607
614
|
#[pyclass(frozen, module = "ferroapi._core")]
|
|
608
615
|
struct Done {
|
|
609
616
|
raw: Py<RawRequest>,
|
|
617
|
+
/// Shared with the request's `Abandon` guard, and emptied here so the task is released while the GIL is held.
|
|
618
|
+
task: Arc<Mutex<Option<Py<PyAny>>>>,
|
|
610
619
|
}
|
|
611
620
|
|
|
612
621
|
#[pymethods]
|
|
613
622
|
impl Done {
|
|
614
623
|
fn __call__(&self, py: Python<'_>, task: &Bound<'_, PyAny>) {
|
|
624
|
+
self.task
|
|
625
|
+
.lock()
|
|
626
|
+
.unwrap_or_else(std::sync::PoisonError::into_inner)
|
|
627
|
+
.take();
|
|
615
628
|
let raw = self.raw.get();
|
|
616
629
|
report_task(py, raw.bridge.event_loop.bind(py), task);
|
|
617
630
|
raw.fail();
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|