@@ -12,111 +12,111 @@ pub struct AddressCodec;
1212
1313#[ derive( Debug , Clone , PartialEq ) ]
1414pub enum Address {
15- None ,
16- FQDN ( String , u16 ) ,
17- IPv4 ( Ipv4Addr , u16 ) ,
18- IPv6 ( Ipv6Addr , u16 ) ,
15+ None ,
16+ FQDN ( String , u16 ) ,
17+ IPv4 ( Ipv4Addr , u16 ) ,
18+ IPv6 ( Ipv6Addr , u16 ) ,
1919}
2020
2121#[ derive( IntoPrimitive , FromPrimitive , Copy , Clone , Debug , PartialEq ) ]
2222#[ repr( u8 ) ]
2323pub enum AddressType {
24- None = u8:: MAX ,
25- FQDN = 0 ,
26- IPv4 = 1 ,
27- IPv6 = 2 ,
28- #[ num_enum( catch_all) ]
29- Other ( u8 ) ,
24+ None = u8:: MAX ,
25+ FQDN = 0 ,
26+ IPv4 = 1 ,
27+ IPv6 = 2 ,
28+ #[ num_enum( catch_all) ]
29+ Other ( u8 ) ,
3030}
3131// https://github.com/zephry-works/wind/blob/main/crates/wind-tuic/SPEC.md#5-address-encoding
3232#[ cfg( feature = "server" ) ]
3333impl Decoder for AddressCodec {
34- type Error = crate :: Error ;
35- type Item = Address ;
34+ type Error = crate :: Error ;
35+ type Item = Address ;
3636
37- fn decode ( & mut self , src : & mut bytes:: BytesMut ) -> Result < Option < Self :: Item > , Self :: Error > {
38- if src. is_empty ( ) {
39- return Ok ( None ) ;
40- }
41- let addr_type = AddressType :: from ( src. get_u8 ( ) ) ;
37+ fn decode ( & mut self , src : & mut bytes:: BytesMut ) -> Result < Option < Self :: Item > , Self :: Error > {
38+ if src. is_empty ( ) {
39+ return Ok ( None ) ;
40+ }
41+ let addr_type = AddressType :: from ( src. get_u8 ( ) ) ;
4242
43- ensure ! ( !matches!( addr_type, AddressType :: Other ( ..) ) , UnknownAddressTypeSnafu { value: u8 :: from( addr_type) } ) ;
44- match addr_type {
45- AddressType :: None => Ok ( Some ( Address :: None ) ) ,
46- AddressType :: IPv4 => {
47- if src. len ( ) < 4 + 2 {
48- return Ok ( None ) ;
49- }
50- let mut octets = [ 0 ; 4 ] ;
51- src. copy_to_slice ( & mut octets) ;
52- let ip = Ipv4Addr :: from ( octets) ;
53- let port = src. get_u16 ( ) ;
54- Ok ( Some ( Address :: IPv4 ( ip, port) ) )
43+ ensure ! ( !matches!( addr_type, AddressType :: Other ( ..) ) , UnknownAddressTypeSnafu { value: u8 :: from( addr_type) } ) ;
44+ match addr_type {
45+ AddressType :: None => Ok ( Some ( Address :: None ) ) ,
46+ AddressType :: IPv4 => {
47+ if src. len ( ) < 4 + 2 {
48+ return Ok ( None ) ;
5549 }
56- AddressType :: IPv6 => {
57- if src. len ( ) < 16 + 2 {
58- return Ok ( None ) ;
59- }
60- let mut octets = [ 0 ; 16 ] ;
61- src . copy_to_slice ( & mut octets ) ;
62- let ip = Ipv6Addr :: from ( octets ) ;
63- let port = src . get_u16 ( ) ;
64- Ok ( Some ( Address :: IPv6 ( ip , port ) ) )
50+ let mut octets = [ 0 ; 4 ] ;
51+ src. copy_to_slice ( & mut octets ) ;
52+ let ip = Ipv4Addr :: from ( octets ) ;
53+ let port = src . get_u16 ( ) ;
54+ Ok ( Some ( Address :: IPv4 ( ip , port ) ) )
55+ }
56+ AddressType :: IPv6 => {
57+ if src . len ( ) < 16 + 2 {
58+ return Ok ( None ) ;
6559 }
66- AddressType :: FQDN => {
67- if src. is_empty ( ) {
68- return Ok ( None ) ;
69- }
70- let domain_len = src. get_u8 ( ) as usize ;
71- if src. len ( ) < domain_len + 2 {
72- return Ok ( None ) ;
73- }
74-
75- let domain = & src[ ..domain_len] ;
76- let domain = str:: from_utf8 ( domain)
77- . context ( FailParseDomainSnafu {
78- raw : hex:: encode ( domain) ,
79- } ) ?
80- . to_string ( ) ;
81- src. advance ( domain_len) ;
82- let port = src. get_u16 ( ) ;
83- Ok ( Some ( Address :: FQDN ( domain, port) ) )
60+ let mut octets = [ 0 ; 16 ] ;
61+ src. copy_to_slice ( & mut octets) ;
62+ let ip = Ipv6Addr :: from ( octets) ;
63+ let port = src. get_u16 ( ) ;
64+ Ok ( Some ( Address :: IPv6 ( ip, port) ) )
65+ }
66+ AddressType :: FQDN => {
67+ if src. is_empty ( ) {
68+ return Ok ( None ) ;
69+ }
70+ let domain_len = src. get_u8 ( ) as usize ;
71+ if src. len ( ) < domain_len + 2 {
72+ return Ok ( None ) ;
8473 }
85- _ => unreachable ! ( ) ,
86- }
87- }
74+
75+ let domain = & src[ ..domain_len] ;
76+ let domain = str:: from_utf8 ( domain)
77+ . context ( FailParseDomainSnafu {
78+ raw : hex:: encode ( domain) ,
79+ } ) ?
80+ . to_string ( ) ;
81+ src. advance ( domain_len) ;
82+ let port = src. get_u16 ( ) ;
83+ Ok ( Some ( Address :: FQDN ( domain, port) ) )
84+ }
85+ _ => unreachable ! ( ) ,
86+ }
87+ }
8888}
8989
9090#[ cfg( feature = "client" ) ]
9191impl Encoder < Address > for AddressCodec {
92- type Error = crate :: Error ;
92+ type Error = crate :: Error ;
9393
94- fn encode ( & mut self , item : Address , dst : & mut bytes:: BytesMut ) -> Result < ( ) , Self :: Error > {
95- match item {
96- Address :: None => {
97- dst. reserve ( 1 ) ;
98- dst. put_u8 ( AddressType :: None . into ( ) ) ;
99- }
100- Address :: IPv4 ( ip, port) => {
101- dst. reserve ( 1 + 4 + 2 ) ;
102- dst. put_slice ( & ip. octets ( ) ) ;
103- dst. put_u16 ( port) ;
104- }
105- Address :: IPv6 ( ip, port) => {
106- dst. reserve ( 1 + 16 + 2 ) ;
107- dst. put_slice ( & ip. octets ( ) ) ;
108- dst. put_u16 ( port) ;
109- }
110- Address :: FQDN ( domain, port) => {
111- if domain. len ( ) > u8:: MAX as usize {
112- return DomainTooLongSnafu { domain } . fail ( ) ;
113- }
114- dst. reserve ( 1 + domain. len ( ) + 2 ) ;
115- dst. put_u8 ( domain. len ( ) as u8 ) ;
116- dst. put_slice ( domain. as_bytes ( ) ) ;
117- dst. put_u16 ( port) ;
94+ fn encode ( & mut self , item : Address , dst : & mut bytes:: BytesMut ) -> Result < ( ) , Self :: Error > {
95+ match item {
96+ Address :: None => {
97+ dst. reserve ( 1 ) ;
98+ dst. put_u8 ( AddressType :: None . into ( ) ) ;
99+ }
100+ Address :: IPv4 ( ip, port) => {
101+ dst. reserve ( 1 + 4 + 2 ) ;
102+ dst. put_slice ( & ip. octets ( ) ) ;
103+ dst. put_u16 ( port) ;
104+ }
105+ Address :: IPv6 ( ip, port) => {
106+ dst. reserve ( 1 + 16 + 2 ) ;
107+ dst. put_slice ( & ip. octets ( ) ) ;
108+ dst. put_u16 ( port) ;
109+ }
110+ Address :: FQDN ( domain, port) => {
111+ if domain. len ( ) > u8:: MAX as usize {
112+ return DomainTooLongSnafu { domain } . fail ( ) ;
118113 }
119- }
120- Ok ( ( ) )
121- }
114+ dst. reserve ( 1 + domain. len ( ) + 2 ) ;
115+ dst. put_u8 ( domain. len ( ) as u8 ) ;
116+ dst. put_slice ( domain. as_bytes ( ) ) ;
117+ dst. put_u16 ( port) ;
118+ }
119+ }
120+ Ok ( ( ) )
121+ }
122122}
0 commit comments