399689 - Websocket RFC6455 extension handshake fails if server doesn't have extension
+ Correcting logic in HandshakeRFC6455 with regards to negotiated extensions
This commit is contained in:
parent
261809380a
commit
552ec4ae36
|
@ -53,10 +53,10 @@ public class HandshakeRFC6455 implements WebSocketHandshake
|
|||
response.addHeader("Sec-WebSocket-Protocol",response.getAcceptedSubProtocol());
|
||||
}
|
||||
|
||||
if (request.getExtensions() != null)
|
||||
if (response.getExtensions() != null)
|
||||
{
|
||||
response.setExtensions(request.getExtensions());
|
||||
for (ExtensionConfig ext : request.getExtensions())
|
||||
response.setExtensions(response.getExtensions());
|
||||
for (ExtensionConfig ext : response.getExtensions())
|
||||
{
|
||||
response.addHeader("Sec-WebSocket-Extensions",ext.getParameterizedName());
|
||||
}
|
||||
|
|
|
@ -29,8 +29,10 @@ import org.eclipse.jetty.websocket.server.helper.IncomingFramesCapture;
|
|||
import org.junit.AfterClass;
|
||||
import org.junit.Assert;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
|
||||
@Ignore("Bug 395444")
|
||||
public class FragmentExtensionTest
|
||||
{
|
||||
private static SimpleServletServer server;
|
||||
|
|
|
@ -29,8 +29,10 @@ import org.eclipse.jetty.websocket.server.helper.IncomingFramesCapture;
|
|||
import org.junit.AfterClass;
|
||||
import org.junit.Assert;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
|
||||
@Ignore("Bug 395444")
|
||||
public class IdentityExtensionTest
|
||||
{
|
||||
private static SimpleServletServer server;
|
||||
|
|
|
@ -107,6 +107,12 @@ public class BrowserDebugTool implements WebSocketCreator
|
|||
public void configure(WebSocketServletFactory factory)
|
||||
{
|
||||
LOG.debug("Configuring WebSocketServerFactory ...");
|
||||
|
||||
// Setup some extensions we want to test against
|
||||
// factory.getExtensionFactory().register("x-webkit-deflate-frame",FrameCompressionExtension.class);
|
||||
// factory.getExtensionFactory().register("permessage-compress",MessageCompressionExtension.class);
|
||||
|
||||
// Setup the desired Socket to use for all incoming upgrade requests
|
||||
factory.setCreator(BrowserDebugTool.this);
|
||||
}
|
||||
};
|
||||
|
|
|
@ -27,6 +27,7 @@ import java.util.Random;
|
|||
import org.eclipse.jetty.util.StringUtil;
|
||||
import org.eclipse.jetty.util.log.Log;
|
||||
import org.eclipse.jetty.util.log.Logger;
|
||||
import org.eclipse.jetty.websocket.api.RemoteEndpoint;
|
||||
import org.eclipse.jetty.websocket.api.Session;
|
||||
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose;
|
||||
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketConnect;
|
||||
|
@ -36,8 +37,45 @@ import org.eclipse.jetty.websocket.api.annotations.WebSocket;
|
|||
@WebSocket
|
||||
public class BrowserSocket
|
||||
{
|
||||
private static class WriteMany implements Runnable
|
||||
{
|
||||
private RemoteEndpoint remote;
|
||||
private int size;
|
||||
private int count;
|
||||
|
||||
public WriteMany(RemoteEndpoint remote, int size, int count)
|
||||
{
|
||||
this.remote = remote;
|
||||
this.size = size;
|
||||
this.count = count;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-|{}[]():".toCharArray();
|
||||
int lettersLen = letters.length;
|
||||
char randomText[] = new char[size];
|
||||
Random rand = new Random();
|
||||
String msg;
|
||||
|
||||
for (int n = 0; n < count; n++)
|
||||
{
|
||||
// create random text
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
randomText[i] = letters[rand.nextInt(lettersLen)];
|
||||
}
|
||||
msg = String.format("Many [%s]",String.valueOf(randomText));
|
||||
remote.sendStringByFuture(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static final Logger LOG = Log.getLogger(BrowserSocket.class);
|
||||
|
||||
private Session session;
|
||||
private RemoteEndpoint remote;
|
||||
private final String userAgent;
|
||||
private final String requestedExtensions;
|
||||
|
||||
|
@ -51,6 +89,7 @@ public class BrowserSocket
|
|||
public void onConnect(Session session)
|
||||
{
|
||||
this.session = session;
|
||||
this.remote = session.getRemote();
|
||||
}
|
||||
|
||||
@OnWebSocketClose
|
||||
|
@ -99,21 +138,31 @@ public class BrowserSocket
|
|||
int size = Integer.parseInt(parts[0]);
|
||||
int count = Integer.parseInt(parts[1]);
|
||||
|
||||
char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-|{}[]():".toCharArray();
|
||||
int lettersLen = letters.length;
|
||||
char randomText[] = new char[size];
|
||||
Random rand = new Random();
|
||||
writeManyAsync(size,count);
|
||||
break;
|
||||
}
|
||||
case "manythreads":
|
||||
{
|
||||
String parts[] = val.split(",");
|
||||
int threadCount = Integer.parseInt(parts[0]);
|
||||
int size = Integer.parseInt(parts[1]);
|
||||
int count = Integer.parseInt(parts[2]);
|
||||
|
||||
for (int n = 0; n < count; n++)
|
||||
Thread threads[] = new Thread[threadCount];
|
||||
|
||||
// Setup threads
|
||||
for (int n = 0; n < threadCount; n++)
|
||||
{
|
||||
// create random text
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
randomText[i] = letters[rand.nextInt(lettersLen)];
|
||||
}
|
||||
writeMessage("Many [%s]",String.valueOf(randomText));
|
||||
threads[n] = new Thread(new WriteMany(remote,size,count),"WriteMany[" + n + "]");
|
||||
}
|
||||
|
||||
// Execute threads
|
||||
for (Thread thread : threads)
|
||||
{
|
||||
thread.start();
|
||||
}
|
||||
|
||||
// Drop out of this thread
|
||||
break;
|
||||
}
|
||||
case "time":
|
||||
|
@ -136,6 +185,24 @@ public class BrowserSocket
|
|||
}
|
||||
}
|
||||
|
||||
private void writeManyAsync(int size, int count)
|
||||
{
|
||||
char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-|{}[]():".toCharArray();
|
||||
int lettersLen = letters.length;
|
||||
char randomText[] = new char[size];
|
||||
Random rand = new Random();
|
||||
|
||||
for (int n = 0; n < count; n++)
|
||||
{
|
||||
// create random text
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
randomText[i] = letters[rand.nextInt(lettersLen)];
|
||||
}
|
||||
writeMessage("Many [%s]",String.valueOf(randomText));
|
||||
}
|
||||
}
|
||||
|
||||
private void writeMessage(String message)
|
||||
{
|
||||
if (this.session == null)
|
||||
|
@ -150,7 +217,8 @@ public class BrowserSocket
|
|||
return;
|
||||
}
|
||||
|
||||
session.getRemote().sendStringByFuture(message);
|
||||
// Async write
|
||||
remote.sendStringByFuture(message);
|
||||
}
|
||||
|
||||
private void writeMessage(String format, Object... args)
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
<input id="info" class="button" type="submit" name="info" value="info" disabled="disabled"/>
|
||||
<input id="time" class="button" type="submit" name="time" value="time" disabled="disabled"/>
|
||||
<input id="many" class="button" type="submit" name="many" value="many" disabled="disabled"/>
|
||||
<input id="manythreads" class="button" type="submit" name="many" value="manythreads" disabled="disabled"/>
|
||||
<input id="hello" class="button" type="submit" name="hello" value="hello" disabled="disabled"/>
|
||||
<input id="there" class="button" type="submit" name="there" value="there" disabled="disabled"/>
|
||||
</div>
|
||||
|
@ -22,6 +23,7 @@
|
|||
$("info").onclick = function(event) {wstool.write("info:"); return false; }
|
||||
$("time").onclick = function(event) {wstool.write("time:"); return false; }
|
||||
$("many").onclick = function(event) {wstool.write("many:15,30"); return false; }
|
||||
$("manythreads").onclick = function(event) {wstool.write("manythreads:20,25,60"); return false; }
|
||||
$("hello").onclick = function(event) {wstool.write("Hello"); return false; }
|
||||
$("there").onclick = function(event) {wstool.write("There"); return false; }
|
||||
</script>
|
||||
|
|
|
@ -70,6 +70,7 @@ var wstool = {
|
|||
$('info').disabled = !enabled;
|
||||
$('time').disabled = !enabled;
|
||||
$('many').disabled = !enabled;
|
||||
$('manythreads').disabled = !enabled;
|
||||
$('hello').disabled = !enabled;
|
||||
$('there').disabled = !enabled;
|
||||
},
|
||||
|
|
Loading…
Reference in New Issue