Skip to content

Instantly share code, notes, and snippets.

@jishanshaikh4
Last active December 13, 2022 08:28
Show Gist options
  • Save jishanshaikh4/04a0b8d00766ee9c852d4040efe6befc to your computer and use it in GitHub Desktop.
Save jishanshaikh4/04a0b8d00766ee9c852d4040efe6befc to your computer and use it in GitHub Desktop.
Sample SOAP server + client (for mentee's poc and assignments) -- Implemented clientIP usage/track
"use strict";
var soap = require('strong-soap').soap;
var fetch = require('node-fetch');
var url = 'http://localhost:8000/test?wsdl';
var options = {
endpoint: 'http://localhost:8000/test'
};
var requestArgs = {
userName: "TEST_USER"
};
// If you comment out this request, server will log server's IP (first fetch)
fetch('http://localhost:8000/', {
method: 'GET'
})
.then((response) => {
console.log("fetch then from client");
})
.catch((error) => {
console.log("fetch error from client: " + error);
})
soap.createClient(url, options, function (err, client) {
if (err) {
console.error("An error has occurred creating SOAP client: ", err);
} else {
var description = client.describe();
console.log("Client description:", description);
var method = client.checkUserName;
method(requestArgs, function (err, result, envelope, soapHeader) {
console.log('Result: \n' + JSON.stringify(result));
});
}
});
"use strict";
var soap = require('strong-soap').soap;
var url = 'http://localhost:8001/test?wsdl';
var options = { endpoint: 'http://localhost:8001/test'};
var requestArgs = { userName: "TEST_USER" };
soap.createClient(url, options, function(err, client) {
if (err) {
console.error("An error has occurred creating SOAP client: " , err);
} else {
var description = client.describe();
//console.log("Client description:" , description);
//console.log(description.CheckUserName_Service.CheckUserName_Port.checkUserName.output.body.elements)
var method = client.checkUserName;
method(requestArgs, function(err, result, envelope, soapHeader) {
//response envelope
//console.log("error "+ err) // null
//console.log(soapHeader); // undefined
//console.log('Response Envelope: \n' + envelope);
//'result' is the response body
//console.log('Result' + result);
console.log('Result: \n' + JSON.stringify(result));
});
}
});
<definitions name = "CheckUserNameService"
targetNamespace = "http://www.examples.com/wsdl/CheckUserNameService.wsdl"
xmlns = "http://schemas.xmlsoap.org/wsdl/"
xmlns:soap = "http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns = "http://www.examples.com/wsdl/CheckUserNameService.wsdl"
xmlns:xsd = "http://www.w3.org/2001/XMLSchema">
<message name = "CheckUserNameRequest">
<part name = "userName" type = "xsd:string"/>
</message>
<message name = "CheckUserNameResponse">
<part name = "status" type = "xsd:string"/>
</message>
<portType name = "CheckUserName_PortType">
<operation name = "checkUserName">
<input message = "tns:CheckUserNameRequest"/>
<output message = "tns:CheckUserNameResponse"/>
</operation>
</portType>
<binding name = "CheckUserName_Binding" type = "tns:CheckUserName_PortType">
<soap:binding style = "rpc"
transport = "http://schemas.xmlsoap.org/soap/http"/>
<operation name = "checkUserName">
<soap:operation soapAction = "checkUserName"/>
<input>
<soap:body encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/" namespace = "urn:examples:CheckUserNameService" use = "encoded"/>
</input>
<output>
<soap:body encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/" namespace = "urn:examples:CheckUserNameService" use = "encoded"/>
</output>
</operation>
</binding>
<service name = "CheckUserName_Service">
<documentation>WSDL File for CheckUserNameService</documentation>
<port binding = "tns:CheckUserName_Binding" name = "CheckUserName_Port">
<soap:address
location = "http://www.examples.com/CheckUserName/" />
</port>
</service>
</definitions>
var soap = require('soap');
var http = require('http');
const util = require('util');
const fetch = require('node-fetch');
const app = require("express")()
var myService;
newApp = app;
var server = http.Server(app);
var port = 8000;
server.listen(port);
console.log("http server started listtening on " + port);
newApp.get('/', (req, res) => {
res.send("Hello World!");
var clientIP = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
//console.log(req.connection.remoteAddress); // will always give server ip on remote connections
myService = {
CheckUserName_Service: {
CheckUserName_Port: {
checkUserName: function (args, soapCallback) {
console.log('checkUserName: Entering function..');
console.log(args);
//console.log(this.request.connection.remoteAddress)
/*
* Where I'm trying to get clietn's IP address
*/
console.log("***")
console.log("IP of client: " + clientIP);
console.log("***")
//console.log(request.connection.remoteAddress);
// res = this.request.connection.remoteAddress;
//console.log(args)
soapCallback("{'username found'}");
}
}
}
};
var xml = require('fs').readFileSync('myservice.wsdl', 'utf8');
var soapServer = soap.listen(server, '/test', myService, xml);
soapServer.log = function (type, data) {
console.log('Type: ' + type + ' data: ' + data);
};
console.log('SOAP service listening on port ' + port);
});
// Need first request to boot up soapservice
fetch('http://localhost:8000/', {
method: 'GET'
})
.then((response) => {
console.log("fetch then + first from server");
})
.catch((error) => {
console.log("fetch error + first from server: " + error);
})
var soap = require('soap');
var http = require('http');
const util = require('util');
const fetch = require('node-fetch'); // npm i node-fetch@2.6.7
const app = require("express")()
newApp = app;
var server = http.Server(app);
var port = 8001;
server.listen(port);
console.log("http server started listening on " + port)
newApp.get('/', (req, res) => {
clientIP = req.ip; // works
// clientIP = req.connection.remoteAddress; // also works
res.send("Hello World!");
var myService = {
CheckUserName_Service: {
CheckUserName_Port: {
checkUserName: function(args, soapCallback) {
console.log('checkUserName: Entering function..');
/*
* Where I'm trying to get clietn's IP address
*/
console.log(clientIP);
soapCallback("Client IP: " + clientIP);
}
}
}
};
var xml = require('fs').readFileSync('myservice.wsdl', 'utf8');
var soapServer = soap.listen(server, '/test', myService, xml);
soapServer.log = function(type, data) {
//console.log('Type: ' + type + ' data: ' + data);
};
console.log('SOAP service attached on port ' + port);
console.log('Waiting for client...');
});
// To execute / in order to start attachment of SOAP server to http server
fetch('http://localhost:8001', { method: 'GET' })
.then((response) => {
// do something with the response
// console.log("fetch then");
})
.catch((error) => {
// handle any errors
console.log("fetch error" + error);
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment