Skip to content
GitLab
    • Explore Projects Groups Snippets
Projects Groups Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
  • A AndroidAsync
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 333
    • Issues 333
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 19
    • Merge requests 19
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Infrastructure Registry
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • Koushik Dutta
  • AndroidAsync
  • Merge requests
  • !67

Add support for the x-webkit-deflate-frame extension

  • Review changes

  • Download
  • Email patches
  • Plain diff
Merged Administrator requested to merge github/fork/soundrop/feature/webkit-deflate-frame into master 11 years ago
  • Overview 2
  • Commits 1
  • Pipelines 0
  • Changes 2

Created by: oleavr

This is limited to inflate-only for now — so the server may send compressed data, but the client will (for now) always send uncompressed data to the server.

Compare
  • master (base)

and
  • latest version
    1b7f44cd
    1 commit, 2 years ago

2 files
+ 52
- 6

    Preferences

    File browser
    Compare changes
AndroidAsync/src‎/com/…/async/http‎
HybiPar‎ser.java‎ +39 -3
WebSocket‎Impl.java‎ +13 -3
AndroidAsync/src/com/koushikdutta/async/http/HybiParser.java
+ 39
- 3
  • View file @ 1b7f44cd

  • Edit in single-file editor

  • Open in Web IDE


@@ -40,16 +40,20 @@ import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.List;
import java.util.zip.DataFormatException;
import java.util.zip.Inflater;
abstract class HybiParser {
private static final String TAG = "HybiParser";
private boolean mMasking = true;
private boolean mDeflate = false;
private int mStage;
private boolean mFinal;
private boolean mMasked;
private boolean mDeflated;
private int mOpcode;
private int mLengthSize;
private int mLength;
@@ -61,6 +65,8 @@ abstract class HybiParser {
private boolean mClosed = false;
private ByteArrayOutputStream mBuffer = new ByteArrayOutputStream();
private Inflater mInflater = new Inflater(true);
private byte[] mInflateBuffer = new byte[4096];
private static final int BYTE = 255;
private static final int FIN = 128;
@@ -106,11 +112,33 @@ abstract class HybiParser {
}
return payload;
}
private byte[] inflate(byte[] payload) throws DataFormatException {
ByteArrayOutputStream inflated = new ByteArrayOutputStream();
mInflater.setInput(payload);
while (!mInflater.needsInput()) {
int chunkSize = mInflater.inflate(mInflateBuffer);
inflated.write(mInflateBuffer, 0, chunkSize);
}
mInflater.setInput(new byte[] { 0, 0, -1, -1 });
while (!mInflater.needsInput()) {
int chunkSize = mInflater.inflate(mInflateBuffer);
inflated.write(mInflateBuffer, 0, chunkSize);
}
return inflated.toByteArray();
}
public void setMasking(boolean masking) {
mMasking = masking;
}
public void setDeflate(boolean deflate) {
mDeflate = deflate;
}
DataCallback mStage0 = new DataCallback() {
@Override
public void onDataAvailable(DataEmitter emitter, ByteBufferList bb) {
@@ -208,12 +236,13 @@ abstract class HybiParser {
boolean rsv2 = (data & RSV2) == RSV2;
boolean rsv3 = (data & RSV3) == RSV3;
if (rsv1 || rsv2 || rsv3) {
if ((!mDeflate && rsv1) || rsv2 || rsv3) {
throw new ProtocolError("RSV not zero");
}
mFinal = (data & FIN) == FIN;
mOpcode = (data & OPCODE);
mDeflated = rsv1;
mMask = new byte[0];
mPayload = new byte[0];
@@ -324,6 +353,13 @@ abstract class HybiParser {
private void emitFrame() throws IOException {
byte[] payload = mask(mPayload, mMask, 0);
if (mDeflated) {
try {
payload = inflate(payload);
} catch (DataFormatException e) {
throw new IOException("Invalid deflated data");
}
}
int opcode = mOpcode;
if (opcode == OP_CONTINUATION) {
AndroidAsync/src/com/koushikdutta/async/http/WebSocketImpl.java
+ 13
- 3
  • View file @ 1b7f44cd

  • Edit in single-file editor

  • Open in Web IDE


@@ -71,7 +71,7 @@ public class WebSocketImpl implements WebSocket {
pending = null;
}
private void setupParser(boolean masking) {
private void setupParser(boolean masking, boolean deflate) {
mParser = new HybiParser(mSocket) {
@Override
protected void report(Exception ex) {
@@ -100,6 +100,7 @@ public class WebSocketImpl implements WebSocket {
}
};
mParser.setMasking(masking);
mParser.setDeflate(deflate);
if (mSocket.isPaused())
mSocket.resume();
}
@@ -126,7 +127,7 @@ public class WebSocketImpl implements WebSocket {
// response.getHeaders().getHeaders().set("Access-Control-Allow-Origin", "http://" + origin);
response.writeHead();
setupParser(false);
setupParser(false, false);
}
public static void addWebSocketUpgradeHeaders(AsyncHttpRequest req, String protocol) {
@@ -134,6 +135,7 @@ public class WebSocketImpl implements WebSocket {
final String key = Base64.encodeToString(toByteArray(UUID.randomUUID()),Base64.NO_WRAP);
headers.set("Sec-WebSocket-Version", "13");
headers.set("Sec-WebSocket-Key", key);
headers.set("Sec-WebSocket-Extensions", "x-webkit-deflate-frame");
headers.set("Connection", "Upgrade");
headers.set("Upgrade", "websocket");
if (protocol != null)
@@ -166,9 +168,17 @@ public class WebSocketImpl implements WebSocket {
String expected = SHA1(concat).trim();
if (!sha1.equalsIgnoreCase(expected))
return null;
String extensions = requestHeaders.get("Sec-WebSocket-Extensions");
boolean deflate = false;
if (extensions != null) {
if (extensions.equals("x-webkit-deflate-frame"))
deflate = true;
else
return null;
}
WebSocketImpl ret = new WebSocketImpl(response.detachSocket());
ret.setupParser(true);
ret.setupParser(true, deflate);
return ret;
}
0 Assignees
None
Assign to
0 Reviewers
None
Request review from
Labels
0
None
0
None
    Assign labels
  • Manage project labels

Milestone
3.3.2
3.3.2 (expired)
None
Time tracking
No estimate or time spent
Lock merge request
Unlocked
0
0 participants
Reference: OpenAPITools/openapi-generator!1353
Source branch: github/fork/soundrop/feature/webkit-deflate-frame

Menu

Explore Projects Groups Snippets