add WORKIng example
This commit is contained in:
@@ -1,12 +1,16 @@
|
|||||||
#![feature(async_await, type_alias_impl_trait)]
|
#![feature(async_await, type_alias_impl_trait)]
|
||||||
|
|
||||||
use std::future::Future;
|
|
||||||
use tonic::{server::{UnaryService, Grpc}, Status, Request, Response, body};
|
|
||||||
use tower_service::Service;
|
|
||||||
use tower_h2::{RecvBody, Server};
|
|
||||||
use tokio::net::TcpListener;
|
|
||||||
use futures_util::future;
|
use futures_util::future;
|
||||||
|
use std::future::Future;
|
||||||
use std::task::{Context, Poll};
|
use std::task::{Context, Poll};
|
||||||
|
use tokio::net::TcpListener;
|
||||||
|
use tonic::{
|
||||||
|
body,
|
||||||
|
server::{Grpc, UnaryService},
|
||||||
|
Request, Response, Status,
|
||||||
|
};
|
||||||
|
use tower_h2::{RecvBody, Server};
|
||||||
|
use tower_service::Service;
|
||||||
|
|
||||||
#[derive(Clone, PartialEq, prost::Message)]
|
#[derive(Clone, PartialEq, prost::Message)]
|
||||||
pub struct HelloRequest {
|
pub struct HelloRequest {
|
||||||
@@ -56,7 +60,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
|||||||
+22
-2
@@ -35,9 +35,24 @@ where
|
|||||||
loop {
|
loop {
|
||||||
match source.try_next().await {
|
match source.try_next().await {
|
||||||
Ok(Some(item)) => {
|
Ok(Some(item)) => {
|
||||||
|
|
||||||
|
|
||||||
|
buf.reserve(5);
|
||||||
|
unsafe {
|
||||||
|
buf.advance_mut(5);
|
||||||
|
}
|
||||||
encoder.encode(item, &mut buf).map_err(drop).unwrap();
|
encoder.encode(item, &mut buf).map_err(drop).unwrap();
|
||||||
let len = buf.len();
|
|
||||||
yield Ok(buf.split_to(len).freeze().into_buf());
|
// now that we know length, we can write the header
|
||||||
|
let len = buf.len() - 5;
|
||||||
|
assert!(len <= ::std::u32::MAX as usize);
|
||||||
|
{
|
||||||
|
let mut cursor = ::std::io::Cursor::new(&mut buf[..5]);
|
||||||
|
cursor.put_u8(0); // byte must be 0, reserve doesn't auto-zero
|
||||||
|
cursor.put_u32_be(len as u32);
|
||||||
|
}
|
||||||
|
|
||||||
|
yield Ok(buf.split_to(len + 5).freeze().into_buf());
|
||||||
},
|
},
|
||||||
Ok(None) => break,
|
Ok(None) => break,
|
||||||
Err(status) => yield Err(status),
|
Err(status) => yield Err(status),
|
||||||
@@ -105,6 +120,7 @@ where
|
|||||||
let mut buf = (&buf1[..]).into_buf();
|
let mut buf = (&buf1[..]).into_buf();
|
||||||
|
|
||||||
if let State::ReadHeader = state {
|
if let State::ReadHeader = state {
|
||||||
|
println!("reading header");
|
||||||
if buf.remaining() < 5 {
|
if buf.remaining() < 5 {
|
||||||
return Ok(None);
|
return Ok(None);
|
||||||
}
|
}
|
||||||
@@ -135,10 +151,14 @@ where
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let State::ReadBody { len, .. } = state {
|
if let State::ReadBody { len, .. } = state {
|
||||||
|
println!("reading body");
|
||||||
if buf.remaining() < *len {
|
if buf.remaining() < *len {
|
||||||
return Ok(None);
|
return Ok(None);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// advance past the header
|
||||||
|
buf1.advance(5);
|
||||||
|
|
||||||
match decoder.decode(buf1) {
|
match decoder.decode(buf1) {
|
||||||
Ok(Some(msg)) => {
|
Ok(Some(msg)) => {
|
||||||
*state = State::ReadHeader;
|
*state = State::ReadHeader;
|
||||||
|
|||||||
Reference in New Issue
Block a user