@magikcraft/mct1
Version:
Minecraft for Type 1 Diabetes
130 lines (129 loc) • 4.75 kB
JavaScript
/*************************************************************************
## Https Module
For handling https requests. Not to be confused with the more robust
and functional 'https' module bundled with Node.js.
### https.request() function
The https.request() function will fetch a web address asynchronously (on a
separate thread)and pass the URL's response to a callback function
which will be executed synchronously (on the main thread). In this
way, https.request() can be used to fetch web content without blocking the
main thread of execution.
#### Parameters
* request: The request details either a plain URL e.g. "https://scriptcraft.js/sample.json" or an object with the following properties...
- url: The URL of the request.
- method: Should be one of the standard HTTPS methods, GET, POST, PUT, DELETE (defaults to GET).
- params: A Javascript object with name-value pairs. This is for supplying parameters to the server.
* callback: The function to be called when the Web request has completed. This function takes the following parameters...
- responseCode: The numeric response code from the server. If the server did not respond with 200 OK then the response parameter will be undefined.
- response: A string (if the response is of type text) or object containing the HTTPS response body.
#### Example
The following example illustrates how to use https.request to make a request to a JSON web service and evaluate its response...
```javascript
var jsResponse;
var https = require('https');
https.request('https://scriptcraftjs.org/sample.json',function(responseCode, responseBody){
jsResponse = JSON.parse( responseBody );
});
```
The following example illustrates a more complex use-case POSTing parameters to a CGI process on a server...
```javascript
var https = require('https');
https.request( {
url: 'https://pixenate.com/pixenate/pxn8.pl',
method: 'POST',
params: {script: '[]'}
},
function( responseCode, responseBody ) {
var jsObj = JSON.parse( responseBody );
});
```
***/
/*global exports, encodeURI, server, __plugin, setTimeout*/
function paramsToString(params) {
var result = '',
paramNames = [],
i
for (i in params) {
paramNames.push(i)
}
for (i = 0; i < paramNames.length; i++) {
result += paramNames[i] + '=' + encodeURI(params[paramNames[i]])
if (i < paramNames.length - 1) result += '&'
}
return result
}
function invokeNow(fn) {
if (__plugin.bukkit) {
server.scheduler.runTask(__plugin, fn)
return
}
if (__plugin.canary) {
fn()
return
}
}
function invokeLater(fn) {
if (__plugin.bukkit) {
server.scheduler.runTaskAsynchronously(__plugin, fn)
return
}
if (__plugin.canary) {
setTimeout(fn, 20)
return
}
}
exports.request = function(request, callback) {
invokeLater(function() {
var url, paramsAsString, conn, requestMethod
if (typeof request === 'string') {
url = request
requestMethod = 'GET'
} else {
url = request.url
paramsAsString = paramsToString(request.params)
if (request.method) {
requestMethod = request.method
} else {
requestMethod = 'GET'
}
if (requestMethod == 'GET' && request.params) {
// append each parameter to the URL
url = request.url + '?' + paramsAsString
}
}
conn = new javax.net.ssl.HttpsURLConnection(
new java.net.URL(url)
).openConnection()
conn.requestMethod = requestMethod
conn.doOutput = true
conn.instanceFollowRedirects = false
if (conn.requestMethod == 'POST') {
conn.doInput = true
// put each parameter in the outputstream
conn.setRequestProperty(
'Content-Type',
'application/x-www-form-urlencoded'
)
conn.setRequestProperty('charset', 'utf-8')
conn.setRequestProperty(
'Content-Length',
'' + paramsAsString.length
)
conn.useCaches = false
var wr = new java.io.DataOutputStream(conn.getOutputStream())
wr.writeBytes(paramsAsString)
wr.flush()
wr.close()
}
var rc = conn.responseCode
var response
var stream
if (rc == 200) {
stream = conn.getInputStream()
response = new java.util.Scanner(stream).useDelimiter('\\A').next()
}
invokeNow(function() {
callback(rc, response)
})
})
}