mirror of
https://github.com/Noratrieb/icefun.git
synced 2026-03-15 08:36:04 +01:00
loop
This commit is contained in:
parent
7af1274587
commit
189f24e53b
58 changed files with 1489 additions and 12529 deletions
|
|
@ -86,49 +86,19 @@ ffi_fn! {
|
|||
}
|
||||
impl UserBody {
|
||||
pub(crate) fn new() -> UserBody {
|
||||
UserBody {
|
||||
data_func: data_noop,
|
||||
userdata: std::ptr::null_mut(),
|
||||
}
|
||||
loop {}
|
||||
}
|
||||
pub(crate) fn poll_data(
|
||||
&mut self,
|
||||
cx: &mut Context<'_>,
|
||||
) -> Poll<Option<crate::Result<Bytes>>> {
|
||||
let mut out = std::ptr::null_mut();
|
||||
match (self.data_func)(self.userdata, hyper_context::wrap(cx), &mut out) {
|
||||
super::task::HYPER_POLL_READY => {
|
||||
if out.is_null() {
|
||||
Poll::Ready(None)
|
||||
} else {
|
||||
let buf = unsafe { Box::from_raw(out) };
|
||||
Poll::Ready(Some(Ok(buf.0)))
|
||||
}
|
||||
}
|
||||
super::task::HYPER_POLL_PENDING => Poll::Pending,
|
||||
super::task::HYPER_POLL_ERROR => {
|
||||
Poll::Ready(Some(Err(crate::Error::new_body_write_aborted())))
|
||||
}
|
||||
unexpected => {
|
||||
Poll::Ready(
|
||||
Some(
|
||||
Err(
|
||||
crate::Error::new_body_write(
|
||||
format!(
|
||||
"unexpected hyper_body_data_func return code {}", unexpected
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
loop {}
|
||||
}
|
||||
pub(crate) fn poll_trailers(
|
||||
&mut self,
|
||||
_cx: &mut Context<'_>,
|
||||
) -> Poll<crate::Result<Option<HeaderMap>>> {
|
||||
Poll::Ready(Ok(None))
|
||||
loop {}
|
||||
}
|
||||
}
|
||||
/// cbindgen:ignore
|
||||
|
|
@ -137,7 +107,7 @@ extern "C" fn data_noop(
|
|||
_: *mut hyper_context<'_>,
|
||||
_: *mut *mut hyper_buf,
|
||||
) -> c_int {
|
||||
super::task::HYPER_POLL_READY
|
||||
loop {}
|
||||
}
|
||||
unsafe impl Send for UserBody {}
|
||||
unsafe impl Sync for UserBody {}
|
||||
|
|
@ -169,6 +139,6 @@ ffi_fn! {
|
|||
}
|
||||
unsafe impl AsTaskType for hyper_buf {
|
||||
fn as_task_type(&self) -> hyper_task_return_type {
|
||||
hyper_task_return_type::HYPER_TASK_BUF
|
||||
loop {}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ ffi_fn! {
|
|||
}
|
||||
unsafe impl AsTaskType for hyper_clientconn {
|
||||
fn as_task_type(&self) -> hyper_task_return_type {
|
||||
hyper_task_return_type::HYPER_TASK_CLIENTCONN
|
||||
loop {}
|
||||
}
|
||||
}
|
||||
ffi_fn! {
|
||||
|
|
|
|||
|
|
@ -25,22 +25,10 @@ pub(crate) enum hyper_code {
|
|||
}
|
||||
impl hyper_error {
|
||||
fn code(&self) -> hyper_code {
|
||||
use crate::error::Kind as ErrorKind;
|
||||
use crate::error::User;
|
||||
match self.0.kind() {
|
||||
ErrorKind::Parse(_) => hyper_code::HYPERE_INVALID_PEER_MESSAGE,
|
||||
ErrorKind::IncompleteMessage => hyper_code::HYPERE_UNEXPECTED_EOF,
|
||||
ErrorKind::User(User::AbortedByCallback) => {
|
||||
hyper_code::HYPERE_ABORTED_BY_CALLBACK
|
||||
}
|
||||
_ => hyper_code::HYPERE_ERROR,
|
||||
}
|
||||
loop {}
|
||||
}
|
||||
fn print_to(&self, dst: &mut [u8]) -> usize {
|
||||
use std::io::Write;
|
||||
let mut dst = std::io::Cursor::new(dst);
|
||||
let _ = write!(dst, "{}", & self.0);
|
||||
dst.position() as usize
|
||||
loop {}
|
||||
}
|
||||
}
|
||||
ffi_fn! {
|
||||
|
|
|
|||
|
|
@ -140,11 +140,7 @@ ffi_fn! {
|
|||
}
|
||||
impl hyper_request {
|
||||
pub(super) fn finalize_request(&mut self) {
|
||||
if let Some(headers) = self.0.extensions_mut().remove::<hyper_headers>() {
|
||||
*self.0.headers_mut() = headers.headers;
|
||||
self.0.extensions_mut().insert(headers.orig_casing);
|
||||
self.0.extensions_mut().insert(headers.orig_order);
|
||||
}
|
||||
loop {}
|
||||
}
|
||||
}
|
||||
ffi_fn! {
|
||||
|
|
@ -211,36 +207,15 @@ ffi_fn! {
|
|||
}
|
||||
impl hyper_response {
|
||||
pub(super) fn wrap(mut resp: Response<Body>) -> hyper_response {
|
||||
let headers = std::mem::take(resp.headers_mut());
|
||||
let orig_casing = resp
|
||||
.extensions_mut()
|
||||
.remove::<HeaderCaseMap>()
|
||||
.unwrap_or_else(HeaderCaseMap::default);
|
||||
let orig_order = resp
|
||||
.extensions_mut()
|
||||
.remove::<OriginalHeaderOrder>()
|
||||
.unwrap_or_else(OriginalHeaderOrder::default);
|
||||
resp.extensions_mut()
|
||||
.insert(hyper_headers {
|
||||
headers,
|
||||
orig_casing,
|
||||
orig_order,
|
||||
});
|
||||
hyper_response(resp)
|
||||
loop {}
|
||||
}
|
||||
fn reason_phrase(&self) -> &[u8] {
|
||||
if let Some(reason) = self.0.extensions().get::<ReasonPhrase>() {
|
||||
return reason.as_bytes();
|
||||
}
|
||||
if let Some(reason) = self.0.status().canonical_reason() {
|
||||
return reason.as_bytes();
|
||||
}
|
||||
&[]
|
||||
loop {}
|
||||
}
|
||||
}
|
||||
unsafe impl AsTaskType for hyper_response {
|
||||
fn as_task_type(&self) -> hyper_task_return_type {
|
||||
hyper_task_return_type::HYPER_TASK_RESPONSE
|
||||
loop {}
|
||||
}
|
||||
}
|
||||
type hyper_headers_foreach_callback = extern "C" fn(
|
||||
|
|
@ -252,10 +227,7 @@ type hyper_headers_foreach_callback = extern "C" fn(
|
|||
) -> c_int;
|
||||
impl hyper_headers {
|
||||
pub(super) fn get_or_default(ext: &mut http::Extensions) -> &mut hyper_headers {
|
||||
if let None = ext.get_mut::<hyper_headers>() {
|
||||
ext.insert(hyper_headers::default());
|
||||
}
|
||||
ext.get_mut::<hyper_headers>().unwrap()
|
||||
loop {}
|
||||
}
|
||||
}
|
||||
ffi_fn! {
|
||||
|
|
@ -306,11 +278,7 @@ ffi_fn! {
|
|||
}
|
||||
impl Default for hyper_headers {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
headers: Default::default(),
|
||||
orig_casing: HeaderCaseMap::default(),
|
||||
orig_order: OriginalHeaderOrder::default(),
|
||||
}
|
||||
loop {}
|
||||
}
|
||||
}
|
||||
unsafe fn raw_name_value(
|
||||
|
|
@ -319,23 +287,11 @@ unsafe fn raw_name_value(
|
|||
value: *const u8,
|
||||
value_len: size_t,
|
||||
) -> Result<(HeaderName, HeaderValue, Bytes), hyper_code> {
|
||||
let name = std::slice::from_raw_parts(name, name_len);
|
||||
let orig_name = Bytes::copy_from_slice(name);
|
||||
let name = match HeaderName::from_bytes(name) {
|
||||
Ok(name) => name,
|
||||
Err(_) => return Err(hyper_code::HYPERE_INVALID_ARG),
|
||||
};
|
||||
let value = std::slice::from_raw_parts(value, value_len);
|
||||
let value = match HeaderValue::from_bytes(value) {
|
||||
Ok(val) => val,
|
||||
Err(_) => return Err(hyper_code::HYPERE_INVALID_ARG),
|
||||
};
|
||||
Ok((name, value, orig_name))
|
||||
loop {}
|
||||
}
|
||||
impl OnInformational {
|
||||
pub(crate) fn call(&mut self, resp: Response<Body>) {
|
||||
let mut resp = hyper_response::wrap(resp);
|
||||
(self.func)(self.data.0, &mut resp);
|
||||
loop {}
|
||||
}
|
||||
}
|
||||
#[cfg(test)]
|
||||
|
|
@ -343,101 +299,11 @@ mod tests {
|
|||
use super::*;
|
||||
#[test]
|
||||
fn test_headers_foreach_cases_preserved() {
|
||||
let mut headers = hyper_headers::default();
|
||||
let name1 = b"Set-CookiE";
|
||||
let value1 = b"a=b";
|
||||
hyper_headers_add(
|
||||
&mut headers,
|
||||
name1.as_ptr(),
|
||||
name1.len(),
|
||||
value1.as_ptr(),
|
||||
value1.len(),
|
||||
);
|
||||
let name2 = b"SET-COOKIE";
|
||||
let value2 = b"c=d";
|
||||
hyper_headers_add(
|
||||
&mut headers,
|
||||
name2.as_ptr(),
|
||||
name2.len(),
|
||||
value2.as_ptr(),
|
||||
value2.len(),
|
||||
);
|
||||
let mut vec = Vec::<u8>::new();
|
||||
hyper_headers_foreach(&headers, concat, &mut vec as *mut _ as *mut c_void);
|
||||
assert_eq!(vec, b"Set-CookiE: a=b\r\nSET-COOKIE: c=d\r\n");
|
||||
extern "C" fn concat(
|
||||
vec: *mut c_void,
|
||||
name: *const u8,
|
||||
name_len: usize,
|
||||
value: *const u8,
|
||||
value_len: usize,
|
||||
) -> c_int {
|
||||
unsafe {
|
||||
let vec = &mut *(vec as *mut Vec<u8>);
|
||||
let name = std::slice::from_raw_parts(name, name_len);
|
||||
let value = std::slice::from_raw_parts(value, value_len);
|
||||
vec.extend(name);
|
||||
vec.extend(b": ");
|
||||
vec.extend(value);
|
||||
vec.extend(b"\r\n");
|
||||
}
|
||||
HYPER_ITER_CONTINUE
|
||||
}
|
||||
loop {}
|
||||
}
|
||||
#[cfg(all(feature = "http1", feature = "ffi"))]
|
||||
#[test]
|
||||
fn test_headers_foreach_order_preserved() {
|
||||
let mut headers = hyper_headers::default();
|
||||
let name1 = b"Set-CookiE";
|
||||
let value1 = b"a=b";
|
||||
hyper_headers_add(
|
||||
&mut headers,
|
||||
name1.as_ptr(),
|
||||
name1.len(),
|
||||
value1.as_ptr(),
|
||||
value1.len(),
|
||||
);
|
||||
let name2 = b"Content-Encoding";
|
||||
let value2 = b"gzip";
|
||||
hyper_headers_add(
|
||||
&mut headers,
|
||||
name2.as_ptr(),
|
||||
name2.len(),
|
||||
value2.as_ptr(),
|
||||
value2.len(),
|
||||
);
|
||||
let name3 = b"SET-COOKIE";
|
||||
let value3 = b"c=d";
|
||||
hyper_headers_add(
|
||||
&mut headers,
|
||||
name3.as_ptr(),
|
||||
name3.len(),
|
||||
value3.as_ptr(),
|
||||
value3.len(),
|
||||
);
|
||||
let mut vec = Vec::<u8>::new();
|
||||
hyper_headers_foreach(&headers, concat, &mut vec as *mut _ as *mut c_void);
|
||||
println!("{}", std::str::from_utf8(& vec).unwrap());
|
||||
assert_eq!(
|
||||
vec, b"Set-CookiE: a=b\r\nContent-Encoding: gzip\r\nSET-COOKIE: c=d\r\n"
|
||||
);
|
||||
extern "C" fn concat(
|
||||
vec: *mut c_void,
|
||||
name: *const u8,
|
||||
name_len: usize,
|
||||
value: *const u8,
|
||||
value_len: usize,
|
||||
) -> c_int {
|
||||
unsafe {
|
||||
let vec = &mut *(vec as *mut Vec<u8>);
|
||||
let name = std::slice::from_raw_parts(name, name_len);
|
||||
let value = std::slice::from_raw_parts(value, value_len);
|
||||
vec.extend(name);
|
||||
vec.extend(b": ");
|
||||
vec.extend(value);
|
||||
vec.extend(b"\r\n");
|
||||
}
|
||||
HYPER_ITER_CONTINUE
|
||||
}
|
||||
loop {}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -84,7 +84,7 @@ extern "C" fn read_noop(
|
|||
_buf: *mut u8,
|
||||
_buf_len: size_t,
|
||||
) -> size_t {
|
||||
0
|
||||
loop {}
|
||||
}
|
||||
/// cbindgen:ignore
|
||||
extern "C" fn write_noop(
|
||||
|
|
@ -93,7 +93,7 @@ extern "C" fn write_noop(
|
|||
_buf: *const u8,
|
||||
_buf_len: size_t,
|
||||
) -> size_t {
|
||||
0
|
||||
loop {}
|
||||
}
|
||||
impl AsyncRead for hyper_io {
|
||||
fn poll_read(
|
||||
|
|
@ -101,21 +101,7 @@ impl AsyncRead for hyper_io {
|
|||
cx: &mut Context<'_>,
|
||||
buf: &mut tokio::io::ReadBuf<'_>,
|
||||
) -> Poll<std::io::Result<()>> {
|
||||
let buf_ptr = unsafe { buf.unfilled_mut() }.as_mut_ptr() as *mut u8;
|
||||
let buf_len = buf.remaining();
|
||||
match (self.read)(self.userdata, hyper_context::wrap(cx), buf_ptr, buf_len) {
|
||||
HYPER_IO_PENDING => Poll::Pending,
|
||||
HYPER_IO_ERROR => {
|
||||
Poll::Ready(
|
||||
Err(std::io::Error::new(std::io::ErrorKind::Other, "io error")),
|
||||
)
|
||||
}
|
||||
ok => {
|
||||
unsafe { buf.assume_init(ok) };
|
||||
buf.advance(ok);
|
||||
Poll::Ready(Ok(()))
|
||||
}
|
||||
}
|
||||
loop {}
|
||||
}
|
||||
}
|
||||
impl AsyncWrite for hyper_io {
|
||||
|
|
@ -124,29 +110,19 @@ impl AsyncWrite for hyper_io {
|
|||
cx: &mut Context<'_>,
|
||||
buf: &[u8],
|
||||
) -> Poll<std::io::Result<usize>> {
|
||||
let buf_ptr = buf.as_ptr();
|
||||
let buf_len = buf.len();
|
||||
match (self.write)(self.userdata, hyper_context::wrap(cx), buf_ptr, buf_len) {
|
||||
HYPER_IO_PENDING => Poll::Pending,
|
||||
HYPER_IO_ERROR => {
|
||||
Poll::Ready(
|
||||
Err(std::io::Error::new(std::io::ErrorKind::Other, "io error")),
|
||||
)
|
||||
}
|
||||
ok => Poll::Ready(Ok(ok)),
|
||||
}
|
||||
loop {}
|
||||
}
|
||||
fn poll_flush(
|
||||
self: Pin<&mut Self>,
|
||||
_: &mut Context<'_>,
|
||||
) -> Poll<std::io::Result<()>> {
|
||||
Poll::Ready(Ok(()))
|
||||
loop {}
|
||||
}
|
||||
fn poll_shutdown(
|
||||
self: Pin<&mut Self>,
|
||||
_: &mut Context<'_>,
|
||||
) -> Poll<std::io::Result<()>> {
|
||||
Poll::Ready(Ok(()))
|
||||
loop {}
|
||||
}
|
||||
}
|
||||
unsafe impl Send for hyper_io {}
|
||||
|
|
|
|||
|
|
@ -81,64 +81,34 @@ pub(crate) trait IntoDynTaskType {
|
|||
}
|
||||
impl hyper_executor {
|
||||
fn new() -> Arc<hyper_executor> {
|
||||
Arc::new(hyper_executor {
|
||||
driver: Mutex::new(FuturesUnordered::new()),
|
||||
spawn_queue: Mutex::new(Vec::new()),
|
||||
is_woken: Arc::new(ExecWaker(AtomicBool::new(false))),
|
||||
})
|
||||
loop {}
|
||||
}
|
||||
pub(crate) fn downgrade(exec: &Arc<hyper_executor>) -> WeakExec {
|
||||
WeakExec(Arc::downgrade(exec))
|
||||
loop {}
|
||||
}
|
||||
fn spawn(&self, task: Box<hyper_task>) {
|
||||
self.spawn_queue.lock().unwrap().push(TaskFuture { task: Some(task) });
|
||||
loop {}
|
||||
}
|
||||
fn poll_next(&self) -> Option<Box<hyper_task>> {
|
||||
self.drain_queue();
|
||||
let waker = futures_util::task::waker_ref(&self.is_woken);
|
||||
let mut cx = Context::from_waker(&waker);
|
||||
loop {
|
||||
match Pin::new(&mut *self.driver.lock().unwrap()).poll_next(&mut cx) {
|
||||
Poll::Ready(val) => return val,
|
||||
Poll::Pending => {
|
||||
if self.drain_queue() {
|
||||
continue;
|
||||
}
|
||||
if self.is_woken.0.swap(false, Ordering::SeqCst) {
|
||||
continue;
|
||||
}
|
||||
return None;
|
||||
}
|
||||
}
|
||||
}
|
||||
loop {}
|
||||
}
|
||||
fn drain_queue(&self) -> bool {
|
||||
let mut queue = self.spawn_queue.lock().unwrap();
|
||||
if queue.is_empty() {
|
||||
return false;
|
||||
}
|
||||
let driver = self.driver.lock().unwrap();
|
||||
for task in queue.drain(..) {
|
||||
driver.push(task);
|
||||
}
|
||||
true
|
||||
loop {}
|
||||
}
|
||||
}
|
||||
impl futures_util::task::ArcWake for ExecWaker {
|
||||
fn wake_by_ref(me: &Arc<ExecWaker>) {
|
||||
me.0.store(true, Ordering::SeqCst);
|
||||
loop {}
|
||||
}
|
||||
}
|
||||
impl WeakExec {
|
||||
pub(crate) fn new() -> Self {
|
||||
WeakExec(Weak::new())
|
||||
loop {}
|
||||
}
|
||||
}
|
||||
impl crate::rt::Executor<BoxFuture<()>> for WeakExec {
|
||||
fn execute(&self, fut: BoxFuture<()>) {
|
||||
if let Some(exec) = self.0.upgrade() {
|
||||
exec.spawn(hyper_task::boxed(fut));
|
||||
}
|
||||
loop {}
|
||||
}
|
||||
}
|
||||
ffi_fn! {
|
||||
|
|
@ -175,30 +145,16 @@ impl hyper_task {
|
|||
F: Future + Send + 'static,
|
||||
F::Output: IntoDynTaskType + Send + Sync + 'static,
|
||||
{
|
||||
Box::new(hyper_task {
|
||||
future: Box::pin(async move { fut.await.into_dyn_task_type() }),
|
||||
output: None,
|
||||
userdata: UserDataPointer(ptr::null_mut()),
|
||||
})
|
||||
loop {}
|
||||
}
|
||||
fn output_type(&self) -> hyper_task_return_type {
|
||||
match self.output {
|
||||
None => hyper_task_return_type::HYPER_TASK_EMPTY,
|
||||
Some(ref val) => val.as_task_type(),
|
||||
}
|
||||
loop {}
|
||||
}
|
||||
}
|
||||
impl Future for TaskFuture {
|
||||
type Output = Box<hyper_task>;
|
||||
fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
|
||||
match Pin::new(&mut self.task.as_mut().unwrap().future).poll(cx) {
|
||||
Poll::Ready(val) => {
|
||||
let mut task = self.task.take().unwrap();
|
||||
task.output = Some(val);
|
||||
Poll::Ready(task)
|
||||
}
|
||||
Poll::Pending => Poll::Pending,
|
||||
}
|
||||
loop {}
|
||||
}
|
||||
}
|
||||
ffi_fn! {
|
||||
|
|
@ -235,12 +191,12 @@ ffi_fn! {
|
|||
}
|
||||
unsafe impl AsTaskType for () {
|
||||
fn as_task_type(&self) -> hyper_task_return_type {
|
||||
hyper_task_return_type::HYPER_TASK_EMPTY
|
||||
loop {}
|
||||
}
|
||||
}
|
||||
unsafe impl AsTaskType for crate::Error {
|
||||
fn as_task_type(&self) -> hyper_task_return_type {
|
||||
hyper_task_return_type::HYPER_TASK_ERROR
|
||||
loop {}
|
||||
}
|
||||
}
|
||||
impl<T> IntoDynTaskType for T
|
||||
|
|
@ -248,7 +204,7 @@ where
|
|||
T: AsTaskType + Send + Sync + 'static,
|
||||
{
|
||||
fn into_dyn_task_type(self) -> BoxAny {
|
||||
Box::new(self)
|
||||
loop {}
|
||||
}
|
||||
}
|
||||
impl<T> IntoDynTaskType for crate::Result<T>
|
||||
|
|
@ -256,10 +212,7 @@ where
|
|||
T: IntoDynTaskType + Send + Sync + 'static,
|
||||
{
|
||||
fn into_dyn_task_type(self) -> BoxAny {
|
||||
match self {
|
||||
Ok(val) => val.into_dyn_task_type(),
|
||||
Err(err) => Box::new(err),
|
||||
}
|
||||
loop {}
|
||||
}
|
||||
}
|
||||
impl<T> IntoDynTaskType for Option<T>
|
||||
|
|
@ -267,15 +220,12 @@ where
|
|||
T: IntoDynTaskType + Send + Sync + 'static,
|
||||
{
|
||||
fn into_dyn_task_type(self) -> BoxAny {
|
||||
match self {
|
||||
Some(val) => val.into_dyn_task_type(),
|
||||
None => ().into_dyn_task_type(),
|
||||
}
|
||||
loop {}
|
||||
}
|
||||
}
|
||||
impl hyper_context<'_> {
|
||||
pub(crate) fn wrap<'a, 'b>(cx: &'a mut Context<'b>) -> &'a mut hyper_context<'b> {
|
||||
unsafe { std::mem::transmute::<&mut Context<'_>, &mut hyper_context<'_>>(cx) }
|
||||
loop {}
|
||||
}
|
||||
}
|
||||
ffi_fn! {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue