Binary/text autodetect
This commit is contained in:
parent
4db9511b12
commit
54454e608b
54
src/relay.rs
54
src/relay.rs
|
@ -27,6 +27,8 @@ use preserves::value::NoEmbeddedDomainCodec;
|
||||||
use preserves::value::PackedReader;
|
use preserves::value::PackedReader;
|
||||||
use preserves::value::PackedWriter;
|
use preserves::value::PackedWriter;
|
||||||
use preserves::value::Reader;
|
use preserves::value::Reader;
|
||||||
|
use preserves::value::TextWriter;
|
||||||
|
use preserves::value::ViaCodec;
|
||||||
use preserves::value::Writer;
|
use preserves::value::Writer;
|
||||||
use preserves::value::signed_integer::SignedInteger;
|
use preserves::value::signed_integer::SignedInteger;
|
||||||
|
|
||||||
|
@ -87,6 +89,7 @@ pub struct TunnelRelay
|
||||||
pending_outbound: Vec<P::TurnEvent>,
|
pending_outbound: Vec<P::TurnEvent>,
|
||||||
self_entity: Arc<Ref<()>>,
|
self_entity: Arc<Ref<()>>,
|
||||||
output: UnboundedSender<LoanedItem<Vec<u8>>>,
|
output: UnboundedSender<LoanedItem<Vec<u8>>>,
|
||||||
|
output_text: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
struct RelayEntity {
|
struct RelayEntity {
|
||||||
|
@ -185,6 +188,7 @@ impl TunnelRelay {
|
||||||
let mut tr = TunnelRelay {
|
let mut tr = TunnelRelay {
|
||||||
self_ref: Arc::clone(&tr_ref),
|
self_ref: Arc::clone(&tr_ref),
|
||||||
output: output_tx,
|
output: output_tx,
|
||||||
|
output_text: true,
|
||||||
inbound_assertions: Map::new(),
|
inbound_assertions: Map::new(),
|
||||||
outbound_assertions: Map::new(),
|
outbound_assertions: Map::new(),
|
||||||
membranes: Membranes {
|
membranes: Membranes {
|
||||||
|
@ -207,31 +211,39 @@ impl TunnelRelay {
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_inbound_datagram(&mut self, t: &mut Activation, bs: &[u8]) -> ActorResult {
|
fn deserialize_one(&mut self, t: &mut Activation, bs: &[u8]) -> (Result<P::Packet, ParseError>, usize) {
|
||||||
let mut src = BytesBinarySource::new(&bs);
|
let mut src = BytesBinarySource::new(&bs);
|
||||||
let mut dec = ActivatedMembranes(t, &self.self_ref, &mut self.membranes);
|
let mut dec = ActivatedMembranes(t, &self.self_ref, &mut self.membranes);
|
||||||
let mut r = src.packed::<_, _Any, _>(&mut dec);
|
match src.peek() {
|
||||||
let item = P::Packet::deserialize(&mut r)?;
|
Ok(v) => if v >= 128 {
|
||||||
|
self.output_text = false;
|
||||||
|
let mut r = src.packed::<_, _Any, _>(&mut dec);
|
||||||
|
let res = P::Packet::deserialize(&mut r);
|
||||||
|
(res, r.source.index)
|
||||||
|
} else {
|
||||||
|
self.output_text = true;
|
||||||
|
let mut dec = ViaCodec::new(dec);
|
||||||
|
let mut r = src.text::<_, _Any, _>(&mut dec);
|
||||||
|
let res = P::Packet::deserialize(&mut r);
|
||||||
|
(res, r.source.index)
|
||||||
|
},
|
||||||
|
Err(e) => (Err(e.into()), 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn handle_inbound_datagram(&mut self, t: &mut Activation, bs: &[u8]) -> ActorResult {
|
||||||
|
let item = self.deserialize_one(t, bs).0?;
|
||||||
self.handle_inbound_packet(t, item)
|
self.handle_inbound_packet(t, item)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_inbound_stream(&mut self, t: &mut Activation, buf: &mut BytesMut) -> ActorResult {
|
fn handle_inbound_stream(&mut self, t: &mut Activation, buf: &mut BytesMut) -> ActorResult {
|
||||||
loop {
|
loop {
|
||||||
let (e, count) = {
|
let (result, count) = self.deserialize_one(t, buf);
|
||||||
let mut src = BytesBinarySource::new(buf);
|
match result {
|
||||||
let mut dec = ActivatedMembranes(t, &self.self_ref, &mut self.membranes);
|
Err(ParseError::Preserves(PreservesError::Io(e)))
|
||||||
let mut r = src.packed::<_, _Any, _>(&mut dec);
|
if is_eof_io_error(&e) => return Ok(()),
|
||||||
let e = match P::Packet::deserialize(&mut r) {
|
Err(e) => return Err(e)?,
|
||||||
Err(ParseError::Preserves(PreservesError::Io(e)))
|
Ok(item) => {
|
||||||
if is_eof_io_error(&e) =>
|
|
||||||
None,
|
|
||||||
result => Some(result?),
|
|
||||||
};
|
|
||||||
(e, r.source.index)
|
|
||||||
};
|
|
||||||
match e {
|
|
||||||
None => return Ok(()),
|
|
||||||
Some(item) => {
|
|
||||||
buf.advance(count);
|
buf.advance(count);
|
||||||
self.handle_inbound_packet(t, item)?;
|
self.handle_inbound_packet(t, item)?;
|
||||||
}
|
}
|
||||||
|
@ -361,7 +373,11 @@ impl TunnelRelay {
|
||||||
fn encode_packet(&mut self, p: P::Packet) -> Result<Vec<u8>, Error> {
|
fn encode_packet(&mut self, p: P::Packet) -> Result<Vec<u8>, Error> {
|
||||||
let item = _Any::from(&p);
|
let item = _Any::from(&p);
|
||||||
// tracing::trace!(packet = debug(&item), "<--");
|
// tracing::trace!(packet = debug(&item), "<--");
|
||||||
Ok(PackedWriter::encode::<_, _Any, _>(&mut self.membranes, &item)?)
|
if self.output_text {
|
||||||
|
Ok(TextWriter::encode::<_, _Any, _>(&mut self.membranes, &item)?.into_bytes())
|
||||||
|
} else {
|
||||||
|
Ok(PackedWriter::encode::<_, _Any, _>(&mut self.membranes, &item)?)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn send_packet(&mut self, debtor: &Arc<Debtor>, cost: usize, p: P::Packet) -> ActorResult {
|
pub fn send_packet(&mut self, debtor: &Arc<Debtor>, cost: usize, p: P::Packet) -> ActorResult {
|
||||||
|
|
Loading…
Reference in New Issue