-
Notifications
You must be signed in to change notification settings - Fork 1
/
codepad.js
104 lines (90 loc) · 1.96 KB
/
codepad.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
var http = require('http')
, querystring = require('querystring')
, url = require('url');
var langs = [
'C',
'C++',
'D',
'Haskell',
'Lua',
'OCaml',
'PHP',
'Perl',
'Python',
'Ruby',
'Scheme',
'Tcl'
];
var codepadEval = function(lang, code, callback, fetchOutput, customProject) {
if (-1 === langs.indexOf(lang)) {
throw "Invalid language";
}
var options = {
port: 80,
path: '/',
method: 'POST',
host: 'codepad.org'
};
var data = '';
var req = http.request(options, function(res) {
res.on('data', function(chunk) {
data += chunk;
});
res.on('end', function() {
if (302 !== res.statusCode) {
callback("Invalid response from codepad", null);
return;
}
if (!fetchOutput) {
callback(null, res.headers.location);
return;
}
// fetch the result
var resultUrl = res.headers.location;
var u = url.parse(resultUrl);
var resultOptions = {
port: 80,
path: u.pathname,
host: u.hostname
};
var data = '';
var resultReq = http.get(resultOptions, function(res) {
res.on('data', function(chunk) {
data += chunk;
});
res.on('end', function() {
if (200 !== res.statusCode) {
callback("Invalid response from inner request", null);
return;
}
// should definitely not be doing this with a regex
var re = new RegExp('<pre><a style="" name="output-line-1">1</a>[^]*?<pre>([^]*?)</pre>');
var out = re.exec(data);
if (out) {
out = out[1].substr(1); // trim leading \n
} else {
out = '';
}
callback(null, {
url: resultUrl,
output: out
});
});
});
});
});
var reqData = {
code: code,
lang: lang,
submit: 'Submit',
run: 'True'
};
if (customProject) {
reqData.project = customProject;
}
reqBody = querystring.stringify(reqData);
req.setHeader('Content-Length', reqBody.length);
req.setHeader('Content-Type', 'application/x-www-form-urlencoded');
req.end(reqBody);
};
exports.eval = codepadEval;