Skip to content

Commit

Permalink
WebSocket Server: Implement WebSocket server protocol option.
Browse files Browse the repository at this point in the history
Change-Id: I02fc5e7ac4b0dbb688ad5789178f9e7643eea8a5
  • Loading branch information
koush committed Aug 30, 2013
1 parent 4a5a55b commit 9fac4cb
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -644,7 +644,7 @@ public void onConnectCompleted(Exception ex, AsyncHttpResponse response) {
}

public Future<WebSocket> websocket(String uri, String protocol, final WebSocketConnectCallback callback) {
assert callback != null;
// assert callback != null;
final AsyncHttpGet get = new AsyncHttpGet(uri.replace("ws://", "http://").replace("wss://", "https://"));
return websocket(get, protocol, callback);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import java.util.LinkedList;
import java.util.UUID;

import android.text.TextUtils;
import android.util.Base64;

import com.koushikdutta.async.AsyncServer;
Expand Down Expand Up @@ -117,6 +118,10 @@ public WebSocketImpl(AsyncHttpServerRequest request, AsyncHttpServerResponse res
response.getHeaders().getHeaders().set("Upgrade", "WebSocket");
response.getHeaders().getHeaders().set("Connection", "Upgrade");
response.getHeaders().getHeaders().set("Sec-WebSocket-Accept", sha1);
String protocol = request.getHeaders().getHeaders().get("Sec-WebSocket-Protocol");
// match the protocol (sanity checking and enforcement is done in the caller)
if (!TextUtils.isEmpty(protocol))
response.getHeaders().getHeaders().set("Sec-WebSocket-Protocol", protocol);
// if (origin != null)
// response.getHeaders().getHeaders().set("Access-Control-Allow-Origin", "http://" + origin);
response.writeHead();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.koushikdutta.async.http.server;

import android.content.Context;
import android.text.TextUtils;

import com.koushikdutta.async.AsyncSSLSocketWrapper;
import com.koushikdutta.async.AsyncServer;
Expand Down Expand Up @@ -259,6 +260,10 @@ public static interface WebSocketRequestCallback {
}

public void websocket(String regex, final WebSocketRequestCallback callback) {
websocket(regex, null, callback);
}

public void websocket(String regex, final String protocol, final WebSocketRequestCallback callback) {
get(regex, new HttpServerRequestCallback() {
@Override
public void onRequest(final AsyncHttpServerRequest request, final AsyncHttpServerResponse response) {
Expand All @@ -278,6 +283,12 @@ public void onRequest(final AsyncHttpServerRequest request, final AsyncHttpServe
response.end();
return;
}
String peerProtocol = request.getHeaders().getHeaders().get("Sec-WebSocket-Protocol");
if (!TextUtils.equals(protocol, peerProtocol)) {
response.responseCode(404);
response.end();
return;
}
callback.onConnected(new WebSocketImpl(request, response), request.getHeaders());
}
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,24 @@ public void onStringAvailable(String s) {

assertTrue(semaphore.tryAcquire(TIMEOUT, TimeUnit.MILLISECONDS));
}

// public void testDisconnect() throws Exception {
// final Semaphore semaphore = new Semaphore(0);
//
// AsyncHttpClient.getDefaultInstance().websocket("http://192.168.1.2:3005", null, new WebSocketConnectCallback() {
// @Override
// public void onCompleted(Exception ex, WebSocket webSocket) {
// webSocket.setClosedCallback(new CompletedCallback() {
// @Override
// public void onCompleted(Exception ex) {
// semaphore.release();
// }
// });
// }
// });
//
// assertTrue(semaphore.tryAcquire(TIMEOUT, TimeUnit.MILLISECONDS));
// }

@Override
protected void tearDown() throws Exception {
Expand Down

0 comments on commit 9fac4cb

Please sign in to comment.