Skip to content

Commit 9a8fe9a

Browse files
committed
1 parent 5a53ca5 commit 9a8fe9a

File tree

6 files changed

+40
-8
lines changed

6 files changed

+40
-8
lines changed

src/main/java/org/java_websocket/WebSocketImpl.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,14 @@
4444
*
4545
*/
4646
public class WebSocketImpl extends WebSocket {
47+
48+
public static final List<Draft> defaultdraftlist = new ArrayList<Draft>( 4 );
49+
static {
50+
defaultdraftlist.add( new Draft_17() );
51+
defaultdraftlist.add( new Draft_10() );
52+
defaultdraftlist.add( new Draft_76() );
53+
defaultdraftlist.add( new Draft_75() );
54+
}
4755

4856
public SelectionKey key;
4957

@@ -111,12 +119,9 @@ public class WebSocketImpl extends WebSocket {
111119
public WebSocketImpl( WebSocketListener listener , List<Draft> drafts , Socket sock ) {
112120
this( listener, (Draft) null, sock );
113121
this.role = Role.SERVER;
122+
// draft.copyInstance will be called when the draft is first needed
114123
if( drafts == null || drafts.isEmpty() ) {
115-
knownDrafts = new ArrayList<Draft>( 1 );
116-
knownDrafts.add( new Draft_17() );
117-
knownDrafts.add( new Draft_10() );
118-
knownDrafts.add( new Draft_76() );
119-
knownDrafts.add( new Draft_75() );
124+
knownDrafts = defaultdraftlist;
120125
} else {
121126
knownDrafts = drafts;
122127
}
@@ -130,7 +135,7 @@ public WebSocketImpl( WebSocketListener listener , Draft draft , Socket sock ) {
130135
inQueue = new LinkedBlockingQueue<ByteBuffer>();
131136
this.wsl = listener;
132137
this.role = Role.CLIENT;
133-
this.draft = draft;
138+
this.draft = draft.copyInstance();
134139
this.socket = sock;
135140
}
136141

@@ -194,6 +199,7 @@ private boolean decodeHandshake( ByteBuffer socketBufferNew ) throws IOException
194199
if( role == Role.SERVER ) {
195200
if( draft == null ) {
196201
for( Draft d : knownDrafts ) {
202+
d = d.copyInstance();
197203
try {
198204
d.setParseMode( role );
199205
socketBuffer.reset();

src/main/java/org/java_websocket/drafts/Draft.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,13 +84,13 @@ public static HandshakeBuilder translateHandshakeHttp( ByteBuffer buf, Role role
8484
}
8585

8686
if( role == Role.CLIENT ) {
87-
// translating/parsing the response from the SERVER
87+
// translating/parsing the response from the SERVER
8888
handshake = new HandshakeImpl1Server();
8989
ServerHandshakeBuilder serverhandshake = (ServerHandshakeBuilder) handshake;
9090
serverhandshake.setHttpStatus( Short.parseShort( firstLineTokens[ 1 ] ) );
9191
serverhandshake.setHttpStatusMessage( firstLineTokens[ 2 ] );
9292
} else {
93-
// translating/parsing the request from the CLIENT
93+
// translating/parsing the request from the CLIENT
9494
ClientHandshakeBuilder clienthandshake = new HandshakeImpl1Client();
9595
clienthandshake.setResourceDescriptor( firstLineTokens[ 1 ] );
9696
handshake = clienthandshake;
@@ -170,6 +170,12 @@ public List<ByteBuffer> createHandshake( Handshakedata handshakedata, Role ownro
170170

171171
public abstract CloseHandshakeType getCloseHandshakeType();
172172

173+
/**
174+
* Drafts must only be by one websocket at all. To prevent drafts to be used more than once the Websocket implementation should call this method in order to create a new usable version of a given draft instance.<br>
175+
* The copy can be safely used in conjunction with a new websocket connection.
176+
* */
177+
public abstract Draft copyInstance();
178+
173179
public Handshakedata translateHandshake( ByteBuffer buf ) throws InvalidHandshakeException {
174180
return translateHandshakeHttp( buf, role );
175181
}

src/main/java/org/java_websocket/drafts/Draft_10.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,11 @@ public void reset() {
386386
incompleteframe = null;
387387
}
388388

389+
@Override
390+
public Draft copyInstance() {
391+
return new Draft_10();
392+
}
393+
389394
@Override
390395
public CloseHandshakeType getCloseHandshakeType() {
391396
return CloseHandshakeType.TWOWAY;

src/main/java/org/java_websocket/drafts/Draft_17.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,9 @@ public ClientHandshakeBuilder postProcessHandshakeRequestAsClient( ClientHandsha
2020
return request;
2121
}
2222

23+
@Override
24+
public Draft copyInstance() {
25+
return new Draft_17();
26+
}
27+
2328
}

src/main/java/org/java_websocket/drafts/Draft_75.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,4 +202,9 @@ public ByteBuffer increaseBuffer( ByteBuffer full ) {
202202
newbuffer.put( full );
203203
return newbuffer;
204204
}
205+
206+
@Override
207+
public Draft copyInstance() {
208+
return new Draft_75();
209+
}
205210
}

src/main/java/org/java_websocket/drafts/Draft_76.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,4 +234,9 @@ public ByteBuffer createBinaryFrame( Framedata framedata ) {
234234
public CloseHandshakeType getCloseHandshakeType() {
235235
return CloseHandshakeType.ONEWAY;
236236
}
237+
238+
@Override
239+
public Draft copyInstance() {
240+
return new Draft_76();
241+
}
237242
}

0 commit comments

Comments
 (0)