@@ -5,9 +5,8 @@ use std::fmt::{self, Debug};
55use std:: str:: FromStr ;
66use serialize:: base64:: { ToBase64 , FromBase64 , STANDARD } ;
77use header:: WebSocketKey ;
8- use openssl:: hash:: { self , hash} ;
9- use openssl:: error:: ErrorStack as SslError ;
108use result:: { WebSocketResult , WebSocketError } ;
9+ use sha1:: Sha1 ;
1110
1211static MAGIC_GUID : & ' static str = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" ;
1312
@@ -16,115 +15,112 @@ static MAGIC_GUID: &'static str = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
1615pub struct WebSocketAccept ( [ u8 ; 20 ] ) ;
1716
1817impl Debug for WebSocketAccept {
19- fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
20- write ! ( f, "WebSocketAccept({})" , self . serialize( ) )
21- }
18+ fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
19+ write ! ( f, "WebSocketAccept({})" , self . serialize( ) )
20+ }
2221}
2322
2423impl FromStr for WebSocketAccept {
25- type Err = WebSocketError ;
24+ type Err = WebSocketError ;
2625
27- fn from_str ( accept : & str ) -> WebSocketResult < WebSocketAccept > {
28- match accept. from_base64 ( ) {
29- Ok ( vec) => {
30- if vec. len ( ) != 20 {
31- return Err ( WebSocketError :: ProtocolError (
32- "Sec-WebSocket-Accept must be 20 bytes"
33- ) ) ;
34- }
35- let mut array = [ 0u8 ; 20 ] ;
36- let mut iter = vec. into_iter ( ) ;
37- for i in array. iter_mut ( ) {
38- * i = iter. next ( ) . unwrap ( ) ;
39- }
40- Ok ( WebSocketAccept ( array) )
41- }
42- Err ( _) => {
43- return Err ( WebSocketError :: ProtocolError (
44- "Invalid Sec-WebSocket-Accept "
45- ) ) ;
46- }
47- }
48- }
26+ fn from_str ( accept : & str ) -> WebSocketResult < WebSocketAccept > {
27+ match accept. from_base64 ( ) {
28+ Ok ( vec) => {
29+ if vec. len ( ) != 20 {
30+ return Err ( WebSocketError :: ProtocolError (
31+ "Sec-WebSocket-Accept must be 20 bytes"
32+ ) ) ;
33+ }
34+ let mut array = [ 0u8 ; 20 ] ;
35+ let mut iter = vec. into_iter ( ) ;
36+ for i in array. iter_mut ( ) {
37+ * i = iter. next ( ) . unwrap ( ) ;
38+ }
39+ Ok ( WebSocketAccept ( array) )
40+ }
41+ Err ( _) => {
42+ return Err ( WebSocketError :: ProtocolError (
43+ "Invalid Sec-WebSocket-Accept "
44+ ) ) ;
45+ }
46+ }
47+ }
4948}
5049
5150impl WebSocketAccept {
52- /// Create a new WebSocketAccept from the given WebSocketKey
53- pub fn new ( key : & WebSocketKey ) -> Result < WebSocketAccept , SslError > {
54- let serialized = key. serialize ( ) ;
55- let mut concat_key = String :: with_capacity ( serialized. len ( ) + 36 ) ;
56- concat_key. push_str ( & serialized[ ..] ) ;
57- concat_key. push_str ( MAGIC_GUID ) ;
58- let output = try!( hash ( hash:: MessageDigest :: sha1 ( ) , concat_key. as_bytes ( ) ) ) ;
59- let mut iter = output. into_iter ( ) ;
60- let mut bytes = [ 0u8 ; 20 ] ;
61- for i in bytes. iter_mut ( ) {
62- * i = iter. next ( ) . unwrap ( ) ;
63- }
64- Ok ( WebSocketAccept ( bytes) )
65- }
66- /// Return the Base64 encoding of this WebSocketAccept
67- pub fn serialize ( & self ) -> String {
68- let WebSocketAccept ( accept) = * self ;
69- accept. to_base64 ( STANDARD )
70- }
51+ /// Create a new WebSocketAccept from the given WebSocketKey
52+ pub fn new ( key : & WebSocketKey ) -> WebSocketAccept {
53+ let serialized = key. serialize ( ) ;
54+ let mut concat_key = String :: with_capacity ( serialized. len ( ) + 36 ) ;
55+ concat_key. push_str ( & serialized[ ..] ) ;
56+ concat_key. push_str ( MAGIC_GUID ) ;
57+ let mut sha1 = Sha1 :: new ( ) ;
58+ sha1. update ( concat_key. as_bytes ( ) ) ;
59+ let bytes = sha1. digest ( ) . bytes ( ) ;
60+ WebSocketAccept ( bytes)
61+ }
62+ /// Return the Base64 encoding of this WebSocketAccept
63+ pub fn serialize ( & self ) -> String {
64+ let WebSocketAccept ( accept) = * self ;
65+ accept. to_base64 ( STANDARD )
66+ }
7167}
7268
7369impl Header for WebSocketAccept {
74- fn header_name ( ) -> & ' static str {
75- "Sec-WebSocket-Accept"
76- }
70+ fn header_name ( ) -> & ' static str {
71+ "Sec-WebSocket-Accept"
72+ }
7773
78- fn parse_header ( raw : & [ Vec < u8 > ] ) -> hyper:: Result < WebSocketAccept > {
79- from_one_raw_str ( raw)
80- }
74+ fn parse_header ( raw : & [ Vec < u8 > ] ) -> hyper:: Result < WebSocketAccept > {
75+ from_one_raw_str ( raw)
76+ }
8177}
8278
8379impl HeaderFormat for WebSocketAccept {
84- fn fmt_header ( & self , fmt : & mut fmt:: Formatter ) -> fmt:: Result {
85- write ! ( fmt, "{}" , self . serialize( ) )
86- }
80+ fn fmt_header ( & self , fmt : & mut fmt:: Formatter ) -> fmt:: Result {
81+ write ! ( fmt, "{}" , self . serialize( ) )
82+ }
8783}
8884
8985#[ cfg( all( feature = "nightly" , test) ) ]
9086mod tests {
91- use super :: * ;
92- use test;
93- use std:: str:: FromStr ;
94- use header:: { Headers , WebSocketKey } ;
95- use hyper:: header:: { Header , HeaderFormatter } ;
96- #[ test]
97- fn test_header_accept ( ) {
98- let key = FromStr :: from_str ( "dGhlIHNhbXBsZSBub25jZQ==" ) . unwrap ( ) ;
99- let accept = WebSocketAccept :: new ( & key) ;
100- let mut headers = Headers :: new ( ) ;
101- headers. set ( accept) ;
102-
103- assert_eq ! ( & headers. to_string( ) [ ..] , "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r \n " ) ;
104- }
105- #[ bench]
106- fn bench_header_accept_new ( b : & mut test:: Bencher ) {
107- let key = WebSocketKey :: new ( ) ;
108- b. iter ( || {
109- let mut accept = WebSocketAccept :: new ( & key) ;
110- test:: black_box ( & mut accept) ;
111- } ) ;
112- }
113- #[ bench]
114- fn bench_header_accept_parse ( b : & mut test:: Bencher ) {
115- let value = vec ! [ b"s3pPLMBiTxaQ9kYGzzhZRbK+xOo=" . to_vec( ) ] ;
116- b. iter ( || {
117- let mut accept: WebSocketAccept = Header :: parse_header ( & value[ ..] ) . unwrap ( ) ;
118- test:: black_box ( & mut accept) ;
119- } ) ;
120- }
121- #[ bench]
122- fn bench_header_accept_format ( b : & mut test:: Bencher ) {
123- let value = vec ! [ b"s3pPLMBiTxaQ9kYGzzhZRbK+xOo=" . to_vec( ) ] ;
124- let val: WebSocketAccept = Header :: parse_header ( & value[ ..] ) . unwrap ( ) ;
125- let fmt = HeaderFormatter ( & val) ;
126- b. iter ( || {
127- format ! ( "{}" , fmt) ;
128- } ) ;
129- }
87+ use super :: * ;
88+ use test;
89+ use std:: str:: FromStr ;
90+ use header:: { Headers , WebSocketKey } ;
91+ use hyper:: header:: { Header , HeaderFormatter } ;
92+ #[ test]
93+ fn test_header_accept ( ) {
94+ let key = FromStr :: from_str ( "dGhlIHNhbXBsZSBub25jZQ==" ) . unwrap ( ) ;
95+ let accept = WebSocketAccept :: new ( & key) ;
96+ let mut headers = Headers :: new ( ) ;
97+ headers. set ( accept) ;
98+
99+ assert_eq ! ( & headers. to_string( ) [ ..] , "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r \n " ) ;
100+ }
101+ #[ bench]
102+ fn bench_header_accept_new ( b : & mut test:: Bencher ) {
103+ let key = WebSocketKey :: new ( ) ;
104+ b. iter ( || {
105+ let mut accept = WebSocketAccept :: new ( & key) ;
106+ test:: black_box ( & mut accept) ;
107+ } ) ;
108+ }
109+ #[ bench]
110+ fn bench_header_accept_parse ( b : & mut test:: Bencher ) {
111+ let value = vec ! [ b"s3pPLMBiTxaQ9kYGzzhZRbK+xOo=" . to_vec( ) ] ;
112+ b. iter ( || {
113+ let mut accept: WebSocketAccept = Header :: parse_header ( & value[ ..] ) . unwrap ( ) ;
114+ test:: black_box ( & mut accept) ;
115+ } ) ;
116+ }
117+ #[ bench]
118+ fn bench_header_accept_format ( b : & mut test:: Bencher ) {
119+ let value = vec ! [ b"s3pPLMBiTxaQ9kYGzzhZRbK+xOo=" . to_vec( ) ] ;
120+ let val: WebSocketAccept = Header :: parse_header ( & value[ ..] ) . unwrap ( ) ;
121+ let fmt = HeaderFormatter ( & val) ;
122+ b. iter ( || {
123+ format ! ( "{}" , fmt) ;
124+ } ) ;
125+ }
130126}
0 commit comments