Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add https module #354

Open
wants to merge 1 commit into
base: development
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/main/js/modules/https/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"name": "https",
"main": "./request.js"
}
137 changes: 137 additions & 0 deletions src/main/js/modules/https/request.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
/*************************************************************************
## 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 );
});
});

};