add WORKIng example

This commit is contained in:
Lucio Franco
2019-08-14 14:47:14 -04:00
parent a5492a2706
commit 55941c0dd1
2 changed files with 32 additions and 8 deletions
+10 -6
View File
@@ -1,12 +1,16 @@
#![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 std::future::Future;
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)]
pub struct HelloRequest {
@@ -56,7 +60,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
}
}
Ok(())
Ok(())
}
#[derive(Debug)]
+22 -2
View File
@@ -35,9 +35,24 @@ where
loop {
match source.try_next().await {
Ok(Some(item)) => {
buf.reserve(5);
unsafe {
buf.advance_mut(5);
}
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,
Err(status) => yield Err(status),
@@ -105,6 +120,7 @@ where
let mut buf = (&buf1[..]).into_buf();
if let State::ReadHeader = state {
println!("reading header");
if buf.remaining() < 5 {
return Ok(None);
}
@@ -135,10 +151,14 @@ where
}
if let State::ReadBody { len, .. } = state {
println!("reading body");
if buf.remaining() < *len {
return Ok(None);
}
// advance past the header
buf1.advance(5);
match decoder.decode(buf1) {
Ok(Some(msg)) => {
*state = State::ReadHeader;