diff options
-rw-r--r-- | cli/http_util.rs | 26 | ||||
-rw-r--r-- | cli/ops/io.rs | 63 |
2 files changed, 46 insertions, 43 deletions
diff --git a/cli/http_util.rs b/cli/http_util.rs index 05074fa4d..24a1b3b28 100644 --- a/cli/http_util.rs +++ b/cli/http_util.rs @@ -195,7 +195,7 @@ impl AsyncRead for HttpBody { let n = min(buf.len(), chunk.len() - inner.pos); { let rest = &chunk[inner.pos..]; - buf[..n].clone_from_slice(&rest[..n]); + buf[..n].copy_from_slice(&rest[..n]); } inner.pos += n; if inner.pos == chunk.len() { @@ -208,14 +208,12 @@ impl AsyncRead for HttpBody { assert_eq!(inner.pos, 0); } - let chunk_future = &mut inner.response.chunk(); - // Safety: `chunk_future` lives only for duration of this poll. So, it doesn't move. - let chunk_future = unsafe { Pin::new_unchecked(chunk_future) }; - match chunk_future.poll(cx) { - Poll::Ready(Err(e)) => { - Poll::Ready(Err(io::Error::new(io::ErrorKind::Other, e))) - } - Poll::Ready(Ok(Some(chunk))) => { + let chunk_future = inner.response.chunk(); + futures::pin_mut!(chunk_future); + + let result = match futures::ready!(chunk_future.poll(cx)) { + Err(e) => Err(io::Error::new(io::ErrorKind::Other, e)), + Ok(Some(chunk)) => { debug!( "HttpBody Real Read buf {} chunk {} pos {}", buf.len(), @@ -223,16 +221,16 @@ impl AsyncRead for HttpBody { inner.pos ); let n = min(buf.len(), chunk.len()); - buf[..n].clone_from_slice(&chunk[..n]); + buf[..n].copy_from_slice(&chunk[..n]); if buf.len() < chunk.len() { inner.pos = n; inner.chunk = Some(chunk); } - Poll::Ready(Ok(n)) + Ok(n) } - Poll::Ready(Ok(None)) => Poll::Ready(Ok(0)), - Poll::Pending => Poll::Pending, - } + Ok(None) => Ok(0), + }; + result.into() } } diff --git a/cli/ops/io.rs b/cli/ops/io.rs index b7f67cea4..7969184ef 100644 --- a/cli/ops/io.rs +++ b/cli/ops/io.rs @@ -156,6 +156,12 @@ pub enum StreamResource { ChildStderr(tokio::process::ChildStderr), } +trait UnpinAsyncRead: AsyncRead + Unpin {} +trait UnpinAsyncWrite: AsyncWrite + Unpin {} + +impl<T: AsyncRead + Unpin> UnpinAsyncRead for T {} +impl<T: AsyncWrite + Unpin> UnpinAsyncWrite for T {} + /// `DenoAsyncRead` is the same as the `tokio_io::AsyncRead` trait /// but uses an `OpError` error instead of `std::io:Error` pub trait DenoAsyncRead { @@ -173,19 +179,18 @@ impl DenoAsyncRead for StreamResource { buf: &mut [u8], ) -> Poll<Result<usize, OpError>> { use StreamResource::*; - let mut f: Pin<Box<dyn AsyncRead>> = match self { - FsFile(f, _) => Box::pin(f), - Stdin(f, _) => Box::pin(f), - TcpStream(f) => Box::pin(f), - ClientTlsStream(f) => Box::pin(f), - ServerTlsStream(f) => Box::pin(f), - ChildStdout(f) => Box::pin(f), - ChildStderr(f) => Box::pin(f), - HttpBody(f) => Box::pin(f), + let f: &mut dyn UnpinAsyncRead = match self { + FsFile(f, _) => f, + Stdin(f, _) => f, + TcpStream(f) => f, + ClientTlsStream(f) => f, + ServerTlsStream(f) => f, + ChildStdout(f) => f, + ChildStderr(f) => f, + HttpBody(f) => f, _ => return Err(OpError::bad_resource_id()).into(), }; - - let v = ready!(f.as_mut().poll_read(cx, buf))?; + let v = ready!(Pin::new(f).poll_read(cx, buf))?; Ok(v).into() } } @@ -252,35 +257,35 @@ impl DenoAsyncWrite for StreamResource { buf: &[u8], ) -> Poll<Result<usize, OpError>> { use StreamResource::*; - let mut f: Pin<Box<dyn AsyncWrite>> = match self { - FsFile(f, _) => Box::pin(f), - Stdout(f) => Box::pin(f), - Stderr(f) => Box::pin(f), - TcpStream(f) => Box::pin(f), - ClientTlsStream(f) => Box::pin(f), - ServerTlsStream(f) => Box::pin(f), - ChildStdin(f) => Box::pin(f), + let f: &mut dyn UnpinAsyncWrite = match self { + FsFile(f, _) => f, + Stdout(f) => f, + Stderr(f) => f, + TcpStream(f) => f, + ClientTlsStream(f) => f, + ServerTlsStream(f) => f, + ChildStdin(f) => f, _ => return Err(OpError::bad_resource_id()).into(), }; - let v = ready!(f.as_mut().poll_write(cx, buf))?; + let v = ready!(Pin::new(f).poll_write(cx, buf))?; Ok(v).into() } fn poll_flush(&mut self, cx: &mut Context) -> Poll<Result<(), OpError>> { use StreamResource::*; - let mut f: Pin<Box<dyn AsyncWrite>> = match self { - FsFile(f, _) => Box::pin(f), - Stdout(f) => Box::pin(f), - Stderr(f) => Box::pin(f), - TcpStream(f) => Box::pin(f), - ClientTlsStream(f) => Box::pin(f), - ServerTlsStream(f) => Box::pin(f), - ChildStdin(f) => Box::pin(f), + let f: &mut dyn UnpinAsyncWrite = match self { + FsFile(f, _) => f, + Stdout(f) => f, + Stderr(f) => f, + TcpStream(f) => f, + ClientTlsStream(f) => f, + ServerTlsStream(f) => f, + ChildStdin(f) => f, _ => return Err(OpError::bad_resource_id()).into(), }; - ready!(f.as_mut().poll_flush(cx))?; + ready!(Pin::new(f).poll_flush(cx))?; Ok(()).into() } |