View Javadoc
1   /*
2    * Copyright 2012 The Netty Project
3    *
4    * The Netty Project licenses this file to you under the Apache License,
5    * version 2.0 (the "License"); you may not use this file except in compliance
6    * with the License. You may obtain a copy of the License at:
7    *
8    *   https://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13   * License for the specific language governing permissions and limitations
14   * under the License.
15   */
16  package io.netty.handler.codec.http.websocketx;
17  
18  import io.netty.handler.codec.http.HttpHeaders;
19  
20  import java.net.URI;
21  
22  import static io.netty.handler.codec.http.websocketx.WebSocketVersion.*;
23  
24  /**
25   * Creates a new {@link WebSocketClientHandshaker} of desired protocol version.
26   */
27  public final class WebSocketClientHandshakerFactory {
28  
29      /**
30       * Private constructor so this static class cannot be instanced.
31       */
32      private WebSocketClientHandshakerFactory() {
33      }
34  
35      /**
36       * Creates a new handshaker.
37       *
38       * @param webSocketURL
39       *            URL for web socket communications. e.g "ws://myhost.com/mypath".
40       *            Subsequent web socket frames will be sent to this URL.
41       * @param version
42       *            Version of web socket specification to use to connect to the server
43       * @param subprotocol
44       *            Sub protocol request sent to the server. Null if no sub-protocol support is required.
45       * @param allowExtensions
46       *            Allow extensions to be used in the reserved bits of the web socket frame
47       * @param customHeaders
48       *            Custom HTTP headers to send during the handshake
49       */
50      public static WebSocketClientHandshaker newHandshaker(
51              URI webSocketURL, WebSocketVersion version, String subprotocol,
52              boolean allowExtensions, HttpHeaders customHeaders) {
53          return newHandshaker(webSocketURL, version, subprotocol, allowExtensions, customHeaders, 65536);
54      }
55  
56      /**
57       * Creates a new handshaker.
58       *
59       * @param webSocketURL
60       *            URL for web socket communications. e.g "ws://myhost.com/mypath".
61       *            Subsequent web socket frames will be sent to this URL.
62       * @param version
63       *            Version of web socket specification to use to connect to the server
64       * @param subprotocol
65       *            Sub protocol request sent to the server. Null if no sub-protocol support is required.
66       * @param allowExtensions
67       *            Allow extensions to be used in the reserved bits of the web socket frame
68       * @param customHeaders
69       *            Custom HTTP headers to send during the handshake
70       * @param maxFramePayloadLength
71       *            Maximum allowable frame payload length. Setting this value to your application's
72       *            requirement may reduce denial of service attacks using long data frames.
73       */
74      public static WebSocketClientHandshaker newHandshaker(
75              URI webSocketURL, WebSocketVersion version, String subprotocol,
76              boolean allowExtensions, HttpHeaders customHeaders, int maxFramePayloadLength) {
77          return newHandshaker(webSocketURL, version, subprotocol, allowExtensions, customHeaders,
78                               maxFramePayloadLength, true, false);
79      }
80  
81      /**
82       * Creates a new handshaker.
83       *
84       * @param webSocketURL
85       *            URL for web socket communications. e.g "ws://myhost.com/mypath".
86       *            Subsequent web socket frames will be sent to this URL.
87       * @param version
88       *            Version of web socket specification to use to connect to the server
89       * @param subprotocol
90       *            Sub protocol request sent to the server. Null if no sub-protocol support is required.
91       * @param allowExtensions
92       *            Allow extensions to be used in the reserved bits of the web socket frame
93       * @param customHeaders
94       *            Custom HTTP headers to send during the handshake
95       * @param maxFramePayloadLength
96       *            Maximum allowable frame payload length. Setting this value to your application's
97       *            requirement may reduce denial of service attacks using long data frames.
98       * @param performMasking
99       *            Whether to mask all written websocket frames. This must be set to true in order to be fully compatible
100      *            with the websocket specifications. Client applications that communicate with a non-standard server
101      *            which doesn't require masking might set this to false to achieve a higher performance.
102      * @param allowMaskMismatch
103      *            When set to true, frames which are not masked properly according to the standard will still be
104      *            accepted.
105      */
106     public static WebSocketClientHandshaker newHandshaker(
107             URI webSocketURL, WebSocketVersion version, String subprotocol,
108             boolean allowExtensions, HttpHeaders customHeaders, int maxFramePayloadLength,
109             boolean performMasking, boolean allowMaskMismatch) {
110         return newHandshaker(webSocketURL, version, subprotocol, allowExtensions, customHeaders,
111                 maxFramePayloadLength, performMasking, allowMaskMismatch, -1);
112     }
113 
114     /**
115      * Creates a new handshaker.
116      *
117      * @param webSocketURL
118      *            URL for web socket communications. e.g "ws://myhost.com/mypath".
119      *            Subsequent web socket frames will be sent to this URL.
120      * @param version
121      *            Version of web socket specification to use to connect to the server
122      * @param subprotocol
123      *            Sub protocol request sent to the server. Null if no sub-protocol support is required.
124      * @param allowExtensions
125      *            Allow extensions to be used in the reserved bits of the web socket frame
126      * @param customHeaders
127      *            Custom HTTP headers to send during the handshake
128      * @param maxFramePayloadLength
129      *            Maximum allowable frame payload length. Setting this value to your application's
130      *            requirement may reduce denial of service attacks using long data frames.
131      * @param performMasking
132      *            Whether to mask all written websocket frames. This must be set to true in order to be fully compatible
133      *            with the websocket specifications. Client applications that communicate with a non-standard server
134      *            which doesn't require masking might set this to false to achieve a higher performance.
135      * @param allowMaskMismatch
136      *            When set to true, frames which are not masked properly according to the standard will still be
137      *            accepted.
138      * @param forceCloseTimeoutMillis
139      *            Close the connection if it was not closed by the server after timeout specified
140      */
141     public static WebSocketClientHandshaker newHandshaker(
142             URI webSocketURL, WebSocketVersion version, String subprotocol,
143             boolean allowExtensions, HttpHeaders customHeaders, int maxFramePayloadLength,
144             boolean performMasking, boolean allowMaskMismatch, long forceCloseTimeoutMillis) {
145         if (version == V13) {
146             return new WebSocketClientHandshaker13(
147                     webSocketURL, V13, subprotocol, allowExtensions, customHeaders,
148                     maxFramePayloadLength, performMasking, allowMaskMismatch, forceCloseTimeoutMillis);
149         }
150         if (version == V08) {
151             return new WebSocketClientHandshaker08(
152                     webSocketURL, V08, subprotocol, allowExtensions, customHeaders,
153                     maxFramePayloadLength, performMasking, allowMaskMismatch, forceCloseTimeoutMillis);
154         }
155         if (version == V07) {
156             return new WebSocketClientHandshaker07(
157                     webSocketURL, V07, subprotocol, allowExtensions, customHeaders,
158                     maxFramePayloadLength, performMasking, allowMaskMismatch, forceCloseTimeoutMillis);
159         }
160         if (version == V00) {
161             return new WebSocketClientHandshaker00(
162                     webSocketURL, V00, subprotocol, customHeaders, maxFramePayloadLength, forceCloseTimeoutMillis);
163         }
164 
165         throw new WebSocketClientHandshakeException("Protocol version " + version + " not supported.");
166     }
167 
168     /**
169      * Creates a new handshaker.
170      *
171      * @param webSocketURL
172      *            URL for web socket communications. e.g "ws://myhost.com/mypath".
173      *            Subsequent web socket frames will be sent to this URL.
174      * @param version
175      *            Version of web socket specification to use to connect to the server
176      * @param subprotocol
177      *            Sub protocol request sent to the server. Null if no sub-protocol support is required.
178      * @param allowExtensions
179      *            Allow extensions to be used in the reserved bits of the web socket frame
180      * @param customHeaders
181      *            Custom HTTP headers to send during the handshake
182      * @param maxFramePayloadLength
183      *            Maximum allowable frame payload length. Setting this value to your application's
184      *            requirement may reduce denial of service attacks using long data frames.
185      * @param performMasking
186      *            Whether to mask all written websocket frames. This must be set to true in order to be fully compatible
187      *            with the websocket specifications. Client applications that communicate with a non-standard server
188      *            which doesn't require masking might set this to false to achieve a higher performance.
189      * @param allowMaskMismatch
190      *            When set to true, frames which are not masked properly according to the standard will still be
191      *            accepted.
192      * @param forceCloseTimeoutMillis
193      *            Close the connection if it was not closed by the server after timeout specified
194      * @param  absoluteUpgradeUrl
195      *            Use an absolute url for the Upgrade request, typically when connecting through an HTTP proxy over
196      *            clear HTTP
197      */
198     public static WebSocketClientHandshaker newHandshaker(
199         URI webSocketURL, WebSocketVersion version, String subprotocol,
200         boolean allowExtensions, HttpHeaders customHeaders, int maxFramePayloadLength,
201         boolean performMasking, boolean allowMaskMismatch, long forceCloseTimeoutMillis, boolean absoluteUpgradeUrl) {
202         if (version == V13) {
203             return new WebSocketClientHandshaker13(
204                 webSocketURL, V13, subprotocol, allowExtensions, customHeaders,
205                 maxFramePayloadLength, performMasking, allowMaskMismatch, forceCloseTimeoutMillis, absoluteUpgradeUrl);
206         }
207         if (version == V08) {
208             return new WebSocketClientHandshaker08(
209                 webSocketURL, V08, subprotocol, allowExtensions, customHeaders,
210                 maxFramePayloadLength, performMasking, allowMaskMismatch, forceCloseTimeoutMillis, absoluteUpgradeUrl);
211         }
212         if (version == V07) {
213             return new WebSocketClientHandshaker07(
214                 webSocketURL, V07, subprotocol, allowExtensions, customHeaders,
215                 maxFramePayloadLength, performMasking, allowMaskMismatch, forceCloseTimeoutMillis, absoluteUpgradeUrl);
216         }
217         if (version == V00) {
218             return new WebSocketClientHandshaker00(
219                 webSocketURL, V00, subprotocol, customHeaders,
220                 maxFramePayloadLength, forceCloseTimeoutMillis, absoluteUpgradeUrl);
221         }
222 
223         throw new WebSocketClientHandshakeException("Protocol version " + version + " not supported.");
224     }
225 
226     /**
227      * Creates a new handshaker.
228      *
229      * @param webSocketURL
230      *            URL for web socket communications. e.g "ws://myhost.com/mypath".
231      *            Subsequent web socket frames will be sent to this URL.
232      * @param version
233      *            Version of web socket specification to use to connect to the server
234      * @param subprotocol
235      *            Sub protocol request sent to the server. Null if no sub-protocol support is required.
236      * @param allowExtensions
237      *            Allow extensions to be used in the reserved bits of the web socket frame
238      * @param customHeaders
239      *            Custom HTTP headers to send during the handshake
240      * @param maxFramePayloadLength
241      *            Maximum allowable frame payload length. Setting this value to your application's
242      *            requirement may reduce denial of service attacks using long data frames.
243      * @param performMasking
244      *            Whether to mask all written websocket frames. This must be set to true in order to be fully compatible
245      *            with the websocket specifications. Client applications that communicate with a non-standard server
246      *            which doesn't require masking might set this to false to achieve a higher performance.
247      * @param allowMaskMismatch
248      *            When set to true, frames which are not masked properly according to the standard will still be
249      *            accepted.
250      * @param forceCloseTimeoutMillis
251      *            Close the connection if it was not closed by the server after timeout specified
252      * @param  absoluteUpgradeUrl
253      *            Use an absolute url for the Upgrade request, typically when connecting through an HTTP proxy over
254      *            clear HTTP
255      * @param generateOriginHeader
256      *            Allows to generate the `Origin`|`Sec-WebSocket-Origin` header value for handshake request
257      *            according to the given webSocketURL
258      */
259     public static WebSocketClientHandshaker newHandshaker(
260             URI webSocketURL, WebSocketVersion version, String subprotocol,
261             boolean allowExtensions, HttpHeaders customHeaders, int maxFramePayloadLength,
262             boolean performMasking, boolean allowMaskMismatch, long forceCloseTimeoutMillis,
263             boolean absoluteUpgradeUrl, boolean generateOriginHeader) {
264         if (version == V13) {
265             return new WebSocketClientHandshaker13(
266                     webSocketURL, V13, subprotocol, allowExtensions, customHeaders,
267                     maxFramePayloadLength, performMasking, allowMaskMismatch, forceCloseTimeoutMillis,
268                     absoluteUpgradeUrl, generateOriginHeader);
269         }
270         if (version == V08) {
271             return new WebSocketClientHandshaker08(
272                     webSocketURL, V08, subprotocol, allowExtensions, customHeaders,
273                     maxFramePayloadLength, performMasking, allowMaskMismatch, forceCloseTimeoutMillis,
274                     absoluteUpgradeUrl, generateOriginHeader);
275         }
276         if (version == V07) {
277             return new WebSocketClientHandshaker07(
278                     webSocketURL, V07, subprotocol, allowExtensions, customHeaders,
279                     maxFramePayloadLength, performMasking, allowMaskMismatch, forceCloseTimeoutMillis,
280                     absoluteUpgradeUrl, generateOriginHeader);
281         }
282         if (version == V00) {
283             return new WebSocketClientHandshaker00(
284                     webSocketURL, V00, subprotocol, customHeaders,
285                     maxFramePayloadLength, forceCloseTimeoutMillis, absoluteUpgradeUrl, generateOriginHeader);
286         }
287 
288         throw new WebSocketClientHandshakeException("Protocol version " + version + " not supported.");
289     }
290 }