| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 | /* eslint-disable no-console */const crypto = require('crypto');const http = require('http');const https = require('https');const url = require('url');const assert = require('assert');const localtunnel = require('./localtunnel');let fakePort;before(done => {  const server = http.createServer();  server.on('request', (req, res) => {    res.write(req.headers.host);    res.end();  });  server.listen(() => {    const { port } = server.address();    fakePort = port;    done();  });});it('query localtunnel server w/ ident', async done => {  const tunnel = await localtunnel({ port: fakePort });  assert.ok(new RegExp('^https://.*localtunnel.me$').test(tunnel.url));  const parsed = url.parse(tunnel.url);  const opt = {    host: parsed.host,    port: 443,    headers: { host: parsed.hostname },    path: '/',  };  const req = https.request(opt, res => {    res.setEncoding('utf8');    let body = '';    res.on('data', chunk => {      body += chunk;    });    res.on('end', () => {      assert(/.*[.]localtunnel[.]me/.test(body), body);      tunnel.close();      done();    });  });  req.end();});it('request specific domain', async () => {  const subdomain = Math.random()    .toString(36)    .substr(2);  const tunnel = await localtunnel({ port: fakePort, subdomain });  assert.ok(new RegExp(`^https://${subdomain}.localtunnel.me$`).test(tunnel.url));  tunnel.close();});describe('--local-host localhost', () => {  it('override Host header with local-host', async done => {    const tunnel = await localtunnel({ port: fakePort, local_host: 'localhost' });    assert.ok(new RegExp('^https://.*localtunnel.me$').test(tunnel.url));    const parsed = url.parse(tunnel.url);    const opt = {      host: parsed.host,      port: 443,      headers: { host: parsed.hostname },      path: '/',    };    const req = https.request(opt, res => {      res.setEncoding('utf8');      let body = '';      res.on('data', chunk => {        body += chunk;      });      res.on('end', () => {        assert.strictEqual(body, 'localhost');        tunnel.close();        done();      });    });    req.end();  });});describe('--local-host 127.0.0.1', () => {  it('override Host header with local-host', async done => {    const tunnel = await localtunnel({ port: fakePort, local_host: '127.0.0.1' });    assert.ok(new RegExp('^https://.*localtunnel.me$').test(tunnel.url));    const parsed = url.parse(tunnel.url);    const opt = {      host: parsed.host,      port: 443,      headers: {        host: parsed.hostname,      },      path: '/',    };    const req = https.request(opt, res => {      res.setEncoding('utf8');      let body = '';      res.on('data', chunk => {        body += chunk;      });      res.on('end', () => {        assert.strictEqual(body, '127.0.0.1');        tunnel.close();        done();      });    });    req.end();  });  it('send chunked request', async done => {    const tunnel = await localtunnel({ port: fakePort, local_host: '127.0.0.1' });    assert.ok(new RegExp('^https://.*localtunnel.me$').test(tunnel.url));    const parsed = url.parse(tunnel.url);    const opt = {      host: parsed.host,      port: 443,      headers: {        host: parsed.hostname,        'Transfer-Encoding': 'chunked',      },      path: '/',    };    const req = https.request(opt, res => {      res.setEncoding('utf8');      let body = '';      res.on('data', chunk => {        body += chunk;      });      res.on('end', () => {        assert.strictEqual(body, '127.0.0.1');        tunnel.close();        done();      });    });    req.end(crypto.randomBytes(1024 * 8).toString('base64'));  });});
 |