Fixie works with both the standard http
and https
modules and with higher-level http clients, including the popular axios
library.
Using Axios
const axios = require('axios');
const url = require('url');
const fixieUrl = url.parse(process.env.FIXIE_URL);
const fixieAuth = fixieUrl.auth.split(':');
axios.get('https://example.com', {
proxy: {
protocol: 'http',
host: fixieUrl.hostname,
port: fixieUrl.port,
auth: {username: fixieAuth[0], password: fixieAuth[1]}
}
}).then(response => {
console.log(response.status);
});
Using fetch
const HttpsProxyAgent = require('https-proxy-agent');
const response = await fetch("https://example.com", {
agent: new HttpsProxyAgent({
proxy: process.env.FIXIE_URL
}),
});
Using http
For those using Fixie Socks,the socks npm package provides an agent that can be used by the Node’s http and https libraries, as well as by popular higher-level libraries like request.
const http = require('http');
const Socks = require('socks');
const fixieUrl = process.env.FIXIE_SOCKS_HOST;
const fixieValues = fixieUrl.split(new RegExp('[/(:\\/@)/]+'));
const socksAgent = new Socks.Agent({
proxy: {
ipaddress: fixieValues[2],
port: fixieValues[3],
type: 5,
authentication: {
username: fixieValues[0],
password: fixieValues[1]
}
}},
true, // true HTTPS server, false for HTTP server
false // rejectUnauthorized option passed to tls.connect()
);
function resHandler(res) {
let responseBody = '';
res.on('data', (chunk) => {
responseBody += chunk;
});
res.on('error', () => {
process.exit(1);
});
res.on('end', () => {
console.log(responseBody);
socksAgent.encryptedSocket.end();
});
}
http.get({ hostname: 'example.com', port: '443', agent: socksAgent}, resHandler);
Connecting to MySQL
MySql2 connects via a SOCKS connection provided as the stream
property. Because Fixie Socks terminates idle connections after 60 seconds of inactivity, we suggest using connection pooling (this is a best practice regardless) or manual error handling. The example below uses connection pooling:
const SocksConnection = require('socksjs');
const mysql = require('mysql2');
const fixieUrl = process.env.FIXIE_SOCKS_HOST;
const fixieValues = fixieUrl.split(new RegExp('[/(:\\/@)/]+'));
const mysqlServer = {
host: 'your-host.example.com',
port: 3306
};
const dbUser = 'user';
const dbPassword = 'password';
const db = 'database';
const fixieConnection = new SocksConnection(mysqlServer, {
user: fixieValues[0],
pass: fixieValues[1],
host: fixieValues[2],
port: fixieValues[3],
});
const mysqlConnPool = mysql.createPool({
user: dbUser,
password: dbPassword,
database: db,
stream: fixieConnection
});
mysqlConnPool.getConnection(function gotConnection(err, connection) {
if (err) throw err;
queryVersion(connection);
});
function queryVersion(connection) {
connection.query('SELECT version();', function (err, rows, fields) {
if (err) throw err;
console.log('MySQL/MariaDB version: ', rows);
connection.release();
process.exit();
});
}
Connecting to Postgres or Amazon Redshift
As with mysql, you can pass a custom stream to the node-postgres library. This will work both for connections to Postgres databases as well as to Amazon Redshift:
const pg = require('pg');
const SocksConnection = require('socksjs');
const fixieUrl = process.env.FIXIE_SOCKS_HOST;
const fixieValues = fixieUrl.split(new RegExp('[/(:\\/@)/]+'));
const pgServer = {
host: 'YOUR-HOST',
port: 5432
};
const fixieConnection = new SocksConnection(pgServer, {
user: fixieValues[0],
pass: fixieValues[1],
host: fixieValues[2],
port: fixieValues[3],
});
const connectionConfig = {
user: 'YOUR-DB-USERNAME',
password: 'YOUR-DB-PASSWORD',
database: 'YOUR-DATABASE',
stream: fixieConnection,
ssl: true // Optional, depending on db config
};
var client = new pg.Client(connectionConfig);
client.connect(function (err) {
if (err) throw err;
client.query('SELECT 1+1 as test1', function (err, result) {
if (err) throw err;
console.log(result.rows[0]);
client.end(function (err) {
if (err) throw err;
});
});
});
Connecting to MongoDB
const mongoose = require('mongoose');
const fixieData = process.env.FIXIE_SOCKS_HOST.split(new RegExp('[/(:\\/@/]+'));
mongoose.connect(process.env.DB_CONNECTION,
{
proxyUsername: fixieData[0],
proxyPassword: fixieData[1],
proxyHost: fixieData[2],
proxyPort: fixieData[3]
},
(error) => {
if(error){
console.log(error)
}
console.log('Connected to database')}
)
Establishing an SSH connection
The SSH2 library can be used to establish an SSH connection and execute commands over Fixie Socks.
var socks = require('socksv5'),
SSHClient = require('ssh2').Client;
const fixieUrl = process.env.FIXIE_SOCKS_HOST;
const fixieValues = fixieUrl.split(new RegExp('[/(:\\/@)/]+'));
socks.connect({
host: 'ssh.example.org',
port: 22,
proxyHost: fixieValues[2],
proxyPort: fixieValues[3],
auths: [socks.auth.UserPassword(fixieValues[0], fixieValues[1])]
}, function(socket) {
var conn = new SSHClient();
conn.on('ready', function() {
conn.exec('uptime', function(err, stream) {
if (err) throw err;
stream.on('close', function(code, signal) {
conn.end();
}).on('data', function(data) {
console.log('STDOUT: ' + data);
}).stderr.on('data', function(data) {
console.log('STDERR: ' + data);
});
});
}).connect({
sock: socket,
username: 'ssh-user',
privateKey: require('fs').readFileSync('/here/is/my/key')
});
});
Having issues? Please reach out to our team here.