-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.js
113 lines (96 loc) · 2.39 KB
/
server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
"use strict";
var https = require('https');
var fs = require('fs');
var qs = require('querystring');
var url = require('url');
var options = {
key: fs.readFileSync('ssl.key'),
cert: fs.readFileSync('ssl.crt')
};
var PORT = 443;
var providing = {};
var posting = {};
var getting = {};
function proxy() {
for (var i in posting) {
for (var j in getting) {
var get = getting[j];
var post = posting[i];
delete getting[j];
delete posting[i];
providing[i] = post;
var data = JSON.stringify({
data: post.data,
path: post.path,
method: post.method,
host: post.host,
headers: post.headers,
id: i
});
console.log(data);
get.res.end(data);
return;
}
}
}
function handleRequest(req, res){
try {
var u = url.parse(req.url, true);
console.log(req.method + ' ' + req.url);
if (req.method === 'POST') {
if (u.pathname === '/provide') {
var data = '';
req.on('data', function (d) {
data += d;
});
req.on('end', function () {
var json = JSON.parse(data);
var post = providing[json.id];
delete providing[json.id];
if (post) {
console.log(json.statusCode + ' ' + json.data.length);
post.res.statusCode = json.statusCode;
post.res.end(json.data);
}
});
} else if (u.pathname === '/push') {
var data = '';
req.on('data', function (d) {
data += d;
});
req.on('end', function () {
var post = {method: 'POST', host: u.query.host, data: data, path: u.query.path + u.search, res: res, id: Math.random(), headers: req.headers};
posting[post.id] = post;
res.on('close', function() {
delete posting[post.id];
});
proxy();
});
}
} else if (req.method === 'GET') {
if (u.pathname === '/pull') {
var get = {res: res, id: Math.random()};
getting[get.id] = get;
res.on('close', function() {
delete getting[get.id];
});
proxy();
} else if (u.pathname === '/push') {
var post = {method: 'GET', path: u.query.path + u.search, res: res, host: u.query.host, id: Math.random()};
posting[post.id] = post;
res.on('close', function() {
delete posting[post.id];
});
proxy();
}
}
} catch (e) {
console.log(e);
}
}
//Create a server
var server = https.createServer(options, handleRequest);
//Start server
server.listen(PORT, function(){
console.log("Server listening on: https://localhost:" + PORT);
});