Skip to content

Commit

Permalink
- Origin header check shouldn't be case sensitive (#27827)
Browse files Browse the repository at this point in the history
Summary:
Based on [this](https://stackoverflow.com/a/5259004), header names are not case sensitive.
That means that it's valid to pass a header `Origin` or `origin`.

With the current implementation. on Android only, if you pass `Origin`, it will get overwritten by the default origin.

This made me waste a lot of time debugging a problem while trying to connect to a websockets server that required an `origin` header and my implementation was working fine in iOS but not on Android, so I'm suggest changing the logic a little bit to take that into account.

## Changelog

[Android] [Fixed] - Support for case insensitive "Origin" headers for Websockets
Pull Request resolved: #27827

Test Plan:
Here's a screenshot of that shows the issue before the fix (`Origin` header set, but getting overridden)

![Screen Shot 2020-01-21 at 11 41 33 AM](https://user-images.githubusercontent.com/1247834/72824606-86302900-3c43-11ea-92c2-3d39881495f0.png)

The fix is not that easy to test since it requires a public websocket server that checks for a custom Origin header, but I think the code changes are very small and clear.

Differential Revision: D19578860

Pulled By: cpojer

fbshipit-source-id: d854e887d1b9e8e54da662b2da2ebe08ce65fdbc
  • Loading branch information
brunobar79 authored and facebook-github-bot committed Jan 27, 2020
1 parent 7a13a1a commit aeaf286
Showing 1 changed file with 8 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -102,26 +102,29 @@ public void connect(
builder.addHeader("Cookie", cookie);
}

boolean hasOriginHeader = false;

if (options != null
&& options.hasKey("headers")
&& options.getType("headers").equals(ReadableType.Map)) {

ReadableMap headers = options.getMap("headers");
ReadableMapKeySetIterator iterator = headers.keySetIterator();

if (!headers.hasKey("origin")) {
builder.addHeader("origin", getDefaultOrigin(url));
}

while (iterator.hasNextKey()) {
String key = iterator.nextKey();
if (ReadableType.String.equals(headers.getType(key))) {
if (key.equalsIgnoreCase("origin")) {
hasOriginHeader = true;
}
builder.addHeader(key, headers.getString(key));
} else {
FLog.w(ReactConstants.TAG, "Ignoring: requested " + key + ", value not a string");
}
}
} else {
}

if (!hasOriginHeader) {
builder.addHeader("origin", getDefaultOrigin(url));
}

Expand Down

0 comments on commit aeaf286

Please sign in to comment.