1*ffe74184SMartin Algesten use std::io::{Read, Write}; 2*ffe74184SMartin Algesten 3*ffe74184SMartin Algesten use super::content::*; 4*ffe74184SMartin Algesten use crate::error::Result; 5*ffe74184SMartin Algesten 6*ffe74184SMartin Algesten // Application data messages are carried by the record layer and are 7*ffe74184SMartin Algesten // fragmented, compressed, and encrypted based on the current connection 8*ffe74184SMartin Algesten // state. The messages are treated as transparent data to the record 9*ffe74184SMartin Algesten // layer. 10*ffe74184SMartin Algesten // https://tools.ietf.org/html/rfc5246#section-10 11*ffe74184SMartin Algesten #[derive(Clone, PartialEq, Eq, Debug)] 12*ffe74184SMartin Algesten pub struct ApplicationData { 13*ffe74184SMartin Algesten pub data: Vec<u8>, 14*ffe74184SMartin Algesten } 15*ffe74184SMartin Algesten 16*ffe74184SMartin Algesten impl ApplicationData { content_type(&self) -> ContentType17*ffe74184SMartin Algesten pub fn content_type(&self) -> ContentType { 18*ffe74184SMartin Algesten ContentType::ApplicationData 19*ffe74184SMartin Algesten } 20*ffe74184SMartin Algesten size(&self) -> usize21*ffe74184SMartin Algesten pub fn size(&self) -> usize { 22*ffe74184SMartin Algesten self.data.len() 23*ffe74184SMartin Algesten } 24*ffe74184SMartin Algesten marshal<W: Write>(&self, writer: &mut W) -> Result<()>25*ffe74184SMartin Algesten pub fn marshal<W: Write>(&self, writer: &mut W) -> Result<()> { 26*ffe74184SMartin Algesten writer.write_all(&self.data)?; 27*ffe74184SMartin Algesten 28*ffe74184SMartin Algesten Ok(writer.flush()?) 29*ffe74184SMartin Algesten } 30*ffe74184SMartin Algesten unmarshal<R: Read>(reader: &mut R) -> Result<Self>31*ffe74184SMartin Algesten pub fn unmarshal<R: Read>(reader: &mut R) -> Result<Self> { 32*ffe74184SMartin Algesten let mut data: Vec<u8> = vec![]; 33*ffe74184SMartin Algesten reader.read_to_end(&mut data)?; 34*ffe74184SMartin Algesten 35*ffe74184SMartin Algesten Ok(ApplicationData { data }) 36*ffe74184SMartin Algesten } 37*ffe74184SMartin Algesten } 38