Skip to content

Instantly share code, notes, and snippets.

@kyo-ago
Last active December 10, 2015 18:58
Show Gist options
  • Save kyo-ago/4478320 to your computer and use it in GitHub Desktop.
Save kyo-ago/4478320 to your computer and use it in GitHub Desktop.
var utils = {};
utils.ab2t = function (buffer) {
var arr = new Int8Array(buffer);
var str = "";
for(var i = 0, l = arr.length; i < l; i++) {
str += String.fromCharCode.call(this, arr[i]);
}
return str;
};
utils.t2ab = function (str) {
var buffer = new ArrayBuffer(str.length);
var view = new DataView(buffer);
for(var i = 0, l = str.length; i < l; i++) {
view.setInt8(i, str.charAt(i).charCodeAt());
}
return buffer;
};
var proxySocket;
function socketeCreate () {
chrome.socket.create('tcp', function (info) {
proxySocket = info.socketId;
chrome.socket.listen(proxySocket, '0.0.0.0', 24888, 200, function () {
socketAccept();
});
});
}
function socketAccept () {
chrome.socket.accept(proxySocket, function (info) {
if (!info.socketId) {
return;
}
var socket = {
'browser' : info.socketId
};
socketAccept();
browserSetNoDelay(socket);
});
}
function browserSetNoDelay (socket) {
chrome.socket.setNoDelay(socket['browser'], true, function () {
connection(socket);
});
}
function connection (socket) {
if (!socket['browser']) {
return;
}
chrome.socket.read(socket['browser'], function (evn) {
var request = {};
request['header'] = utils.ab2t(evn.data);
if (!request['header']) {
chrome.socket.disconnect(socket['browser']);
chrome.socket.destroy(socket['browser']);
return;
}
var match = request['header'].match(/Host:\s*(.+?)\r?\n/i);
if (!match) {
match = request['header'].match(/GET\s+(.+?)\s/i);
return;
}
request['host'] = match[1];
chrome.socket.create('tcp', function (info) {
socket['server'] = info.socketId;
connectionServer(socket, request);
});
});
}
function connectionServer (socket, request) {
chrome.socket.connect(socket['server'], request['host'], 80, function () {
chrome.socket.write(socket['server'], utils.t2ab(request['header']), function () {
readServer(socket, request, {
'text' : ''
});
});
});
}
function readServer (socket, request, response) {
chrome.socket.read(socket['server'], function (evn) {
if (evn.data.byteLength) {
response['text'] += utils.ab2t(evn.data);
readServer(socket, request, response);
return;
}
writeBrowser(socket, request, response);
});
}
function writeBrowser (socket, request, response) {
chrome.socket.disconnect(socket['server']);
chrome.socket.destroy(socket['server']);
delete socket['server'];
chrome.socket.write(socket['browser'], utils.t2ab(response.text), function () {
chrome.socket.disconnect(socket['browser']);
chrome.socket.destroy(socket['browser']);
delete socket['browser']
});
}
socketeCreate();
{
"name": "localproxy for chrome apps",
"version": "1",
"manifest_version": 2,
"minimum_chrome_version": "23",
"icons": {
"16": "/src/img/logo.png",
"128": "/src/img/logo.png"
},
"app": {
"background": {
"scripts": [
"/src/js/background.js"
]
}
},
"permissions": [
"experimental",
"http://*/",
{"socket": ["tcp-listen", "tcp-connect"]}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment