OLD | NEW |
---|---|
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 part of dart.io; | 5 part of dart.io; |
6 | 6 |
7 /** | 7 /** |
8 * WebSocket status codes used when closing a WebSocket connection. | 8 * WebSocket status codes used when closing a WebSocket connection. |
9 */ | 9 */ |
10 abstract class WebSocketStatus { | 10 abstract class WebSocketStatus { |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
72 const CompressionOptions( | 72 const CompressionOptions( |
73 {this.clientNoContextTakeover: false, | 73 {this.clientNoContextTakeover: false, |
74 this.serverNoContextTakeover: false, | 74 this.serverNoContextTakeover: false, |
75 this.clientMaxWindowBits: _WebSocketImpl.DEFAULT_WINDOW_BITS, | 75 this.clientMaxWindowBits: _WebSocketImpl.DEFAULT_WINDOW_BITS, |
76 this.serverMaxWindowBits: _WebSocketImpl.DEFAULT_WINDOW_BITS, | 76 this.serverMaxWindowBits: _WebSocketImpl.DEFAULT_WINDOW_BITS, |
77 this.enabled: true}); | 77 this.enabled: true}); |
78 | 78 |
79 /// Parses list of requested server headers to return server compression | 79 /// Parses list of requested server headers to return server compression |
80 /// response headers. Uses [serverMaxWindowBits] value if set, otherwise will | 80 /// response headers. Uses [serverMaxWindowBits] value if set, otherwise will |
81 /// attempt to use value from headers. Defaults to | 81 /// attempt to use value from headers. Defaults to |
82 /// [WebSocket.DEFAULT_WINDOW_BITS] | 82 /// [WebSocket.DEFAULT_WINDOW_BITS] |
Søren Gjesse
2015/11/11 13:31:08
Please update the documentation to explain the two
butlermatt
2015/11/11 18:26:30
Done.
| |
83 List _createServerResponseHeader(HeaderValue requested) { | 83 List _createServerResponseHeader(HeaderValue requested) { |
84 var info = new List(2); | 84 var info = new List(2); |
85 | 85 |
86 int mwb; | 86 int mwb; |
87 var part = requested.parameters[_serverMaxWindowBits]; | 87 String part; |
88 if (requested?.parameters != null) { | |
89 part = requested.parameters[_serverMaxWindowBits]; | |
90 } | |
88 if (part != null) { | 91 if (part != null) { |
89 if (part.length >= 2 && part.startsWith('0')) { | 92 if (part.length >= 2 && part.startsWith('0')) { |
90 throw new ArgumentError("Illegal 0 padding on value."); | 93 throw new ArgumentError("Illegal 0 padding on value."); |
91 } else { | 94 } else { |
92 mwb = serverMaxWindowBits == null | 95 mwb = serverMaxWindowBits == null |
93 ? int.parse(part, | 96 ? int.parse(part, |
94 onError: (source) => _WebSocketImpl.DEFAULT_WINDOW_BITS) | 97 onError: (source) => _WebSocketImpl.DEFAULT_WINDOW_BITS) |
95 : serverMaxWindowBits; | 98 : serverMaxWindowBits; |
96 info[0] = "; server_max_window_bits=${mwb}"; | 99 info[0] = "; server_max_window_bits=${mwb}"; |
97 info[1] = mwb; | 100 info[1] = mwb; |
98 } | 101 } |
99 } else { | 102 } else { |
103 info[0] = ""; | |
100 info[1] = _WebSocketImpl.DEFAULT_WINDOW_BITS; | 104 info[1] = _WebSocketImpl.DEFAULT_WINDOW_BITS; |
101 } | 105 } |
102 return info; | 106 return info; |
103 } | 107 } |
104 | 108 |
105 /// Returns default values for client compression request headers. | 109 /// Returns default values for client compression request headers. |
106 List _createClientRequestHeader(HeaderValue requested) { | 110 List _createClientRequestHeader(HeaderValue requested, int size) { |
Søren Gjesse
2015/11/11 13:31:08
This is no longer returning a List.
butlermatt
2015/11/11 18:26:30
Done.
| |
107 var info = new List(2); | 111 var info = ""; |
108 | 112 |
109 info[1] = _WebSocketImpl.DEFAULT_WINDOW_BITS; | 113 // If responding to a valid request, specify size |
110 if (requested != null && | 114 if (requested != null) { |
111 requested.parameters[_clientMaxWindowBits] != null) { | 115 info = "; client_max_window_bits=$size"; |
112 info[0] = "; client_max_window_bits=${info[1]}"; | |
113 } else { | 116 } else { |
114 info[0] = "; client_max_window_bits"; | 117 // Client request. Specify default |
118 info = "; client_max_window_bits"; | |
115 } | 119 } |
116 | 120 |
117 return info; | 121 return info; |
118 } | 122 } |
119 | 123 |
120 /// Create a Compression Header. If [requested] is null or contains | 124 /// Create a Compression Header. If [requested] is null or contains |
121 /// client request headers, returns Client compression request headers. | 125 /// client request headers, returns Client compression request headers. |
122 /// If [requested] contains server response headers this method returns | 126 /// If [requested] contains server response headers this method returns |
123 /// a Server compression response header. | 127 /// a Server compression response header. |
124 List _createHeader([HeaderValue requested]) { | 128 List _createHeader([HeaderValue requested]) { |
Søren Gjesse
2015/11/11 13:31:08
See above.
butlermatt
2015/11/11 18:26:30
Done.
| |
125 if (!enabled) { | 129 if (!enabled) { |
126 return ["", 0]; | 130 return ["", 0]; |
127 } | 131 } |
128 | 132 |
129 var info = new List(2); | 133 var info = new List(2); |
130 var header = _WebSocketImpl.PER_MESSAGE_DEFLATE; | 134 var header = _WebSocketImpl.PER_MESSAGE_DEFLATE; |
131 | 135 |
132 if (clientNoContextTakeover && | 136 if (clientNoContextTakeover && |
133 (requested != null && | 137 (requested != null && |
134 requested.parameters.containsKey(_clientNoContextTakeover))) { | 138 requested.parameters.containsKey(_clientNoContextTakeover))) { |
135 header += "; client_no_context_takeover"; | 139 header += "; client_no_context_takeover"; |
136 } | 140 } |
137 | 141 |
138 if (serverNoContextTakeover && | 142 if (serverNoContextTakeover && |
139 (requested != null && | 143 (requested != null && |
140 requested.parameters.containsKey(_serverNoContextTakeover))) { | 144 requested.parameters.containsKey(_serverNoContextTakeover))) { |
141 header += "; server_no_context_takeover"; | 145 header += "; server_no_context_takeover"; |
142 } | 146 } |
143 | 147 |
144 if (requested == null || | 148 var headerList = _createServerResponseHeader(requested); |
145 requested.parameters.containsKey(_clientMaxWindowBits)) { | 149 header += headerList[0]; |
146 var clientList = _createClientRequestHeader(requested); | 150 info[1] = headerList[1]; |
147 header += clientList[0]; | 151 |
148 info[1] = clientList[1]; | 152 var clientList = _createClientRequestHeader(requested, info[1]); |
149 } else { | 153 header += clientList; |
150 var headerList = _createServerResponseHeader(requested); | |
151 header += headerList[0]; | |
152 info[1] = headerList[1]; | |
153 } | |
154 | 154 |
155 info[0] = header; | 155 info[0] = header; |
156 | |
157 return info; | 156 return info; |
158 } | 157 } |
159 } | 158 } |
160 | 159 |
161 /** | 160 /** |
162 * The [WebSocketTransformer] provides the ability to upgrade a | 161 * The [WebSocketTransformer] provides the ability to upgrade a |
163 * [HttpRequest] to a [WebSocket] connection. It supports both | 162 * [HttpRequest] to a [WebSocket] connection. It supports both |
164 * upgrading a single [HttpRequest] and upgrading a stream of | 163 * upgrading a single [HttpRequest] and upgrading a stream of |
165 * [HttpRequest]s. | 164 * [HttpRequest]s. |
166 * | 165 * |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
391 Future addStream(Stream stream); | 390 Future addStream(Stream stream); |
392 } | 391 } |
393 | 392 |
394 class WebSocketException implements IOException { | 393 class WebSocketException implements IOException { |
395 final String message; | 394 final String message; |
396 | 395 |
397 const WebSocketException([this.message = ""]); | 396 const WebSocketException([this.message = ""]); |
398 | 397 |
399 String toString() => "WebSocketException: $message"; | 398 String toString() => "WebSocketException: $message"; |
400 } | 399 } |
OLD | NEW |