mirror of
https://github.com/cypress-io/cypress.git
synced 2026-01-23 15:39:05 -06:00
* https-proxy: unused file * server: wrap all https requests that use a proxy * server: use request lib in ensureUrl if proxy is in use. this makes runs tab work behind a proxy * electron: pass --proxy-server to app itself, so the embedded github login page works * cli: first attempt at env vars from windows registry * cli: api cleanup * cli: lint * cli: fix crash on no proxy, add tests * add desktop-gui watch to terminals.json * cli: pass along --proxy-source * electron: pass --proxy-bypass-list too * server: whitelist proxy* args * cli: better wording * desktop-gui: display proxy settings * extension: force proxy [wip] * extension: finally, i am victorious over coffeescript * extension: add -loopback to bypasslist * extension: revert changes Revert "extension: force proxy [wip]" This reverts commit 3ab6ba42a763f25ee65f12eb8b79eb597efc9b11. * desktop-gui: skip proxysettings if there aren't any * https-proxy, server: proxy directConnections using https-proxy-agent * https-agent: pool httpsAgents * https-proxy: work when they're not on a proxy * https-proxy: ci - use agent 1.0 * https-proxy: tests * desktop-gui: hide proxy settings when not using proxy * https-proxy: pass req through to https-proxy-agent callback * cli: use get-windows-proxy * desktop-gui: always show proxy settings * server: use get-windows-proxy * electron, server: supply electron proxy config when window launched * server: fix * https-proxy: cleanup * server: clean up ensureUrl * https-proxy: cleanup * cli: fix * cli: fix destructuring * server: enable ForeverAgent to pool HTTPS/HTTP connections #3192 * server: updating snapshot * https-proxy: don't crash, do error if proxy unreachable * https-proxy: * get-windows-proxy@1.0.0 * https-proxy: use proxy-from-env to decide on a proxy for a url * server: fallback to HTTP_PROXY globally if HTTPS_PROXY not set * server: proxy args test * cli: add proxy tests * cli: add test that loadSystemProxySettings is called during download * cli, server: account for the fact that CI has some proxy vars set * https-proxy: "" * cli, https-proxy, server: "" * desktop-gui: update settings gui * desktop-gui: cypress tests for proxy settings * server: strict undefined check * cli, server: move get-windows-proxy to scope, optionalDeps * server, cli: use new and improved get-windows-proxy * cli, server: 1.5.0 * server: re-check for proxy since cli may have failed to load the lib * server, cli: 1.5.1 * server: NO_PROXY=localhost by default, clean up * https-proxy: disable Nagle's on proxy sockets \#3192 * https-proxy: use setNoDelay on upstream, cache https agent * https-proxy: test basic auth * https-proxy: add todo: remove this * server: add custom HTTP(s) Agent implementation w keepalive, tunneling * server: typescript for agent * add ts to zunder * server: more ts * ts: add missing Agent type declaration * server: create CombinedAgent * server: use agent in more places * ts: more declarations * server: make script work even if debug port not supplied * server: begin some testing * server, ts: agent, tests * server: test * server: agent works with websockets now * server: update snapshot * server: work out some more bugs with websockets * server: more websockets * server: add net_profiler * https-proxy: fix dangling socket on direct connection * server: fix potential 'headers have already been sent' * https-proxy: nab another dangler * server: update test to expect agent * https-proxy: fix failing test * desktop-gui: change on-link * server: add tests for empty response case * server: tests * server: send keep-alive with requests * server: make net profiler hook on socket.connect * server: only hook profiler once * server: update tests, add keep-alive test * server: only regen headers if needed * server: move http_overrides into CombinedAgent, make it proxy-proof for #112 * server: update snapshot * server: undo * server: avoid circular dependency * https-proxy, server: use our Agent instead of https-proxy-agent * server: add dependency back * cli: actually use proxy for download * server, launcher, ts: typescript * Revert "server, launcher, ts: typescript" This reverts commitd3f8b8bbb6. * Revert "Revert "server, launcher, ts: typescript"" This reverts commit818dfdfd00. * ts, server: respond to PR * server, ts: types * ts: really fix types * https-proxy, server: export CA from https-proxy * agent, server, https-proxy: move agent to own package * agent => networking, move connect into networking * fix tests * fix test * networking: respond to PR changes, add more unit tests * rename ctx * networking, ts: add more tests * server: add ensureUrl tests * https-proxy: remove https-proxy-agent * server: use CombinedAgent for API * server: updates * add proxy performance tests * add perf tests to workflow * circle * run perf tests with --no-sandbox * networking, ts: ch-ch-ch-ch-changes * server, networking: pr changes * run networking tests in circle * server: fix performance test * https-proxy: test that sockets are being closed * https-proxy: write, not emit * networking: fix test * networking: bubble err in connect * networking: style * networking: clean p connect error handling * networking => network * server: make perf tests really work * server: really report * server: use args from browser * server: use AI to determine max run time * server: load electron only when needed Co-authored-by: Brian Mann <brian@cypress.io>
236 lines
6.1 KiB
CoffeeScript
236 lines
6.1 KiB
CoffeeScript
require("../spec_helper")
|
|
|
|
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"
|
|
|
|
_ = require("lodash")
|
|
DebugProxy = require("debugging-proxy")
|
|
net = require("net")
|
|
path = require("path")
|
|
Promise = require("bluebird")
|
|
proxy = require("../helpers/proxy")
|
|
httpServer = require("../helpers/http_server")
|
|
httpsServer = require("../helpers/https_server")
|
|
|
|
describe "Proxy", ->
|
|
beforeEach ->
|
|
Promise.join(
|
|
httpServer.start()
|
|
|
|
httpsServer.start(8443)
|
|
|
|
httpsServer.start(8444)
|
|
|
|
proxy.start(3333)
|
|
.then (@proxy) =>
|
|
)
|
|
|
|
afterEach ->
|
|
Promise.join(
|
|
httpServer.stop()
|
|
httpsServer.stop()
|
|
proxy.stop()
|
|
)
|
|
|
|
it "can request the googles", ->
|
|
## give some padding to external
|
|
## network request
|
|
@timeout(10000)
|
|
|
|
Promise.all([
|
|
request({
|
|
strictSSL: false
|
|
proxy: "http://localhost:3333"
|
|
url: "https://www.google.com"
|
|
})
|
|
|
|
request({
|
|
strictSSL: false
|
|
proxy: "http://localhost:3333"
|
|
url: "https://mail.google.com"
|
|
})
|
|
|
|
request({
|
|
strictSSL: false
|
|
proxy: "http://localhost:3333"
|
|
url: "https://google.com"
|
|
})
|
|
])
|
|
|
|
it "can call the httpsDirectly without a proxy", ->
|
|
request({
|
|
strictSSL: false
|
|
url: "https://localhost:8443"
|
|
})
|
|
|
|
it "can boot the httpsServer", ->
|
|
request({
|
|
strictSSL: false
|
|
url: "https://localhost:8443/"
|
|
proxy: "http://localhost:3333"
|
|
})
|
|
.then (html) ->
|
|
expect(html).to.include("https server")
|
|
|
|
it "yields the onRequest callback", ->
|
|
request({
|
|
strictSSL: false
|
|
url: "https://localhost:8443/replace"
|
|
proxy: "http://localhost:3333"
|
|
})
|
|
.then (html) ->
|
|
expect(html).to.include("replaced content")
|
|
|
|
it "can pass directly through", ->
|
|
## this will fail due to dynamic cert
|
|
## generation when strict ssl is true
|
|
request({
|
|
strictSSL: false
|
|
url: "https://localhost:8444/replace"
|
|
proxy: "http://localhost:3333"
|
|
})
|
|
.then (html) ->
|
|
expect(html).to.include("https server")
|
|
|
|
it "closes outgoing connections when client disconnects", ->
|
|
@sandbox.spy(net.Socket.prototype, 'connect')
|
|
|
|
request({
|
|
strictSSL: false
|
|
url: "https://localhost:8444/replace"
|
|
proxy: "http://localhost:3333"
|
|
resolveWithFullResponse: true
|
|
})
|
|
.then (res) =>
|
|
## ensure client has disconnected
|
|
expect(res.socket.destroyed).to.be.true
|
|
## ensure the outgoing socket created for this connection was destroyed
|
|
socket = net.Socket.prototype.connect.getCalls()
|
|
.find (call) =>
|
|
_.isEqual(call.args.slice(0,2), ["8444", "localhost"])
|
|
.thisValue
|
|
expect(socket.destroyed).to.be.true
|
|
|
|
it "can boot the httpServer", ->
|
|
request({
|
|
strictSSL: false
|
|
url: "http://localhost:8080/"
|
|
proxy: "http://localhost:3333"
|
|
})
|
|
.then (html) ->
|
|
expect(html).to.include("http server")
|
|
|
|
context "generating certificates", ->
|
|
it "reuses existing certificates", ->
|
|
request({
|
|
strictSSL: false
|
|
url: "https://localhost:8443/"
|
|
proxy: "http://localhost:3333"
|
|
})
|
|
.then =>
|
|
proxy.reset()
|
|
|
|
## force this to reject if its called
|
|
@sandbox.stub(@proxy, "_generateMissingCertificates").rejects(new Error("should not call"))
|
|
|
|
request({
|
|
strictSSL: false
|
|
url: "https://localhost:8443/"
|
|
proxy: "http://localhost:3333"
|
|
})
|
|
|
|
context "closing", ->
|
|
it "resets sslServers and can reopen", ->
|
|
request({
|
|
strictSSL: false
|
|
url: "https://localhost:8443/"
|
|
proxy: "http://localhost:3333"
|
|
})
|
|
.then =>
|
|
proxy.stop()
|
|
.then =>
|
|
proxy.start(3333)
|
|
.then =>
|
|
## force this to reject if its called
|
|
@sandbox.stub(@proxy, "_generateMissingCertificates").rejects(new Error("should not call"))
|
|
|
|
request({
|
|
strictSSL: false
|
|
url: "https://localhost:8443/"
|
|
proxy: "http://localhost:3333"
|
|
})
|
|
|
|
context "with an upstream proxy", ->
|
|
beforeEach ->
|
|
@oldEnv = Object.assign({}, process.env)
|
|
process.env.NO_PROXY = ""
|
|
process.env.HTTP_PROXY = process.env.HTTPS_PROXY = "http://localhost:9001"
|
|
|
|
@upstream = new DebugProxy({
|
|
keepRequests: true
|
|
})
|
|
|
|
@upstream.start(9001)
|
|
|
|
it "passes a request to an https server through the upstream", ->
|
|
request({
|
|
strictSSL: false
|
|
url: "https://localhost:8444/"
|
|
proxy: "http://localhost:3333"
|
|
}).then (res) =>
|
|
expect(@upstream.getRequests()[0]).to.include({
|
|
url: 'localhost:8444'
|
|
https: true
|
|
})
|
|
expect(res).to.contain("https server")
|
|
|
|
it "uses HTTP basic auth when provided", ->
|
|
@upstream.setAuth({
|
|
username: 'foo'
|
|
password: 'bar'
|
|
})
|
|
|
|
process.env.HTTP_PROXY = process.env.HTTPS_PROXY = "http://foo:bar@localhost:9001"
|
|
|
|
request({
|
|
strictSSL: false
|
|
url: "https://localhost:8444/"
|
|
proxy: "http://localhost:3333"
|
|
}).then (res) =>
|
|
expect(@upstream.getRequests()[0]).to.include({
|
|
url: 'localhost:8444'
|
|
https: true
|
|
})
|
|
expect(res).to.contain("https server")
|
|
|
|
it "closes outgoing connections when client disconnects", ->
|
|
@sandbox.spy(net.Socket.prototype, 'connect')
|
|
|
|
request({
|
|
strictSSL: false
|
|
url: "https://localhost:8444/replace"
|
|
proxy: "http://localhost:3333"
|
|
resolveWithFullResponse: true
|
|
forever: false
|
|
})
|
|
.then (res) =>
|
|
## ensure client has disconnected
|
|
expect(res.socket.destroyed).to.be.true
|
|
|
|
## ensure the outgoing socket created for this connection was destroyed
|
|
socket = net.Socket.prototype.connect.getCalls()
|
|
.find (call) =>
|
|
_.isEqual(call.args[0][0], {
|
|
host: 'localhost'
|
|
port: 9001
|
|
})
|
|
.thisValue
|
|
|
|
new Promise (resolve) ->
|
|
socket.on 'close', =>
|
|
expect(socket.destroyed).to.be.true
|
|
resolve()
|
|
|
|
afterEach ->
|
|
@upstream.stop()
|
|
Object.assign(process.env, @oldEnv)
|