mirror of
https://github.com/cypress-io/cypress.git
synced 2026-01-17 12:39:55 -06:00
* fix specs * use debugger protocol for cookie handling in electron * use latest gulp * use rimraf instead of gulp-clean * use electron 3.1.8 and node 10.2.1 * use gulp 4 in packages/static * fix sendCommandAsync, log Schema.getDomains on CDP connect * autofill e2e test name [skip ci] * electron@5.0.7, see what new failures exist * --no-sandbox for launching Electron * update cookies logic for electron * node 12 * update snapshot for new node * update error message for new node * stub sendCommandAsync * only connect to socket if path has been replaced, fixes #4776 * update node-sass to support node 12 * skip wacky socket tests for now * snapshot * fix run_plugins_spec snapshot, don't include stack trace * use --no-sandbox on linux to run as root * allow sendCommandAsync to resolve * use euid for root check * log domains even if undefined * don't worry about ending 1xx responses immediately anymore * use --max-http-header-size, change max size from 8kb to 1mb, fix #76 * do not send 502 on failed websocket, just send back ECONNRESET * update websocket spec port to not collide with other test * update outdated expect * Revert "only connect to socket if path has been replaced, fixes #4776" This reverts commitf179eda5ca. * update gulp in root * update https-proxy unit tests * update network spec to properly close server * update reporter spec * update https-proxy-agent to fix node 10.10.0 change discussion: https://github.com/nodejs/node/issues/24474\#issuecomment-511963799 * only pass --max-http-header-size on node >=12 * use own server-destroy implementation that supports secureConnect events * oops * update socket_spec * electron 6.0.0 * console.table introduced in node 10 * change browserify entry to init.js * handle edge case when no response body * console.table added in node 10 * do not exit app when all BrowserWindows are closed * update e2e snapshots * value may not be null * update plugins spec * correct cookie expiry, use browser.getversion for CDP version check * fix snapshotting for require stacks * reorder cookies in spec * warn when depreated electron callback apis are used * only report 1 plugin error per process * cleanup * node 12.4.0, cypress/browsers:node12.4.0-chrome76 docker image * update shell.openExternal to promisified * update dialog.showOpenDialog to promisified * update webContents.session.setProxy to promisified * updating native dependencies since we don't need ancient node ABI support anymore * WIP: switch cookies to simpler, jar-less approach * WIP: switch cookies to simpler, jar-less approach * making tests pass * improve cookie filtering logic * Remove unneeded Promise.try * filter what makes it to the extension * properly re-set superdomain cookies on cross-origin cy.visit * allow comma-separated list of e2e tests * sort cookies in order of expiration date, ascending * updating tests, cleanup * update tests * version electron as a devDependency, electron@6.0.1 * cleanup, remove old automation * cleanup, remove old automation * bump chokidar to fix win10 + node12 issue was seeing this on windows: https://github.com/nuxt/nuxt.js/issues/6035 fixed with version bump * enable now-supported quit role, re-enable old tests * don't need that arg there * remove last deprecated callback electron invocations * Delete cypress.json * responding to PR feedback * cleanup * invoke * use 'quit' role * Use new appMenu role for Cypress menu on mac * electron@6.0.2 * electron@6.0.3 * remove domain: cookie.domain and see what happens * remove setErrorHandler * Revert "remove domain: cookie.domain and see what happens" This reverts commit49e916896d. * add unit tests for cookies * ci * fix project-content css * electron@6.0.4 * fix specs_list test * electron@6.0.7 * some cleanup * electron@6.0.9 * Update 8_reporters_spec.coffee.js * electron@5.0.10 - Chromium 73, Node 12 * cli: fix the STDIN pipe on Windows (#5045) * cli: pipe stdin * uggh, here is the actual change * update cli unit tests * add unit test * more permissive check for json to include application/vnd.api+j… (#5166) * more permissive check for json to include * add json test for content-type application/vnd.api+json * cruder solution passes e2e tests locally, so let's go with that * Remove 'charset' from content-type before checking if JSON * fix eslint for fixture specs (#5176) * update eslint to lint files within 'fixtures' in support files - ignore some edge cases like jquery, jsx and obvious js files we wrote with broken code * Fixes from eslint to 'fixtures' files * Catch env variable with reserved name CYPRESS_ENV 1621 (#1626) * server: check CYPRESS_ENV variable when merging configs * catch invalid CYPRESS_ENV value in CLI, close #1621 * linting * sanitize platform in test snapshot * linting * update error message text * add missing comma * fix finally merge in JS code * pass CLI linter * fix log reference, should be debug * use correct sinon reference * update message, show first part in red * update error message text * Addresses #2953 (#5174) * Addresses #2953 * Added proper test for new error message * Didn't realize it ran this test as well, whoops * Implementing changes as suggested by @jennifer-shehane * Fixing tests and error output. Moved the checks to the start of the get command to ensure we always catch improper options * Removing issue test since the querying spec covers it * Using coffescript isArray check * depromisify things that were promisified b/t electron 5 <=> 6 Revert "update shell.openExternal to promisified" This reverts commit8b6460d015. Revert "update dialog.showOpenDialog to promisified" This reverts commit5f178b075b. Revert "update webContents.session.setProxy to promisified" This reverts commit727df3a4e5. * node12.4.0-chrome76 => node12.0.0-chrome75 * fix tests for electron downgrade * node12.0.0-chrome75 => node12.0.0-chrome73 Co-authored-by: Zach Bloomquist <github@chary.us> Co-authored-by: Brian Mann <brian.mann86@gmail.com>
301 lines
8.3 KiB
CoffeeScript
301 lines
8.3 KiB
CoffeeScript
require("../spec_helper")
|
|
|
|
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"
|
|
|
|
_ = require("lodash")
|
|
DebugProxy = require("@cypress/debugging-proxy")
|
|
fs = require("fs-extra")
|
|
https = require("https")
|
|
net = require("net")
|
|
network = require("@packages/network")
|
|
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 "retries 5 times", ->
|
|
@sandbox.spy(net, 'connect')
|
|
|
|
request({
|
|
strictSSL: false
|
|
url: "https://localhost:12344"
|
|
proxy: "http://localhost:3333"
|
|
})
|
|
.then ->
|
|
throw new Error("should not reach")
|
|
.catch ->
|
|
expect(net.connect).to.have.callCount(5)
|
|
|
|
it "closes outgoing connections when client disconnects", ->
|
|
@sandbox.spy(net, '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.connect.getCalls()
|
|
.find (call) =>
|
|
call.args[0].port == "8444" && call.args[0].host == "localhost"
|
|
.returnValue
|
|
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"
|
|
})
|
|
|
|
## https://github.com/cypress-io/cypress/issues/771
|
|
it "generates certs and can proxy requests for HTTPS requests to IPs", ->
|
|
@sandbox.spy(@proxy, "_generateMissingCertificates")
|
|
@sandbox.spy(@proxy, "_getServerPortForIp")
|
|
|
|
Promise.all([
|
|
httpsServer.start(8445),
|
|
@proxy._ca.removeAll()
|
|
])
|
|
.then =>
|
|
request({
|
|
strictSSL: false
|
|
url: "https://127.0.0.1:8445/"
|
|
proxy: "http://localhost:3333"
|
|
})
|
|
.then =>
|
|
## this should not stand up its own https server
|
|
request({
|
|
strictSSL: false
|
|
url: "https://localhost:8443/"
|
|
proxy: "http://localhost:3333"
|
|
})
|
|
.then =>
|
|
expect(@proxy._ipServers["127.0.0.1"]).to.be.an.instanceOf(https.Server)
|
|
expect(@proxy._getServerPortForIp).to.be.calledWith('127.0.0.1').and.be.calledOnce
|
|
expect(@proxy._generateMissingCertificates).to.be.calledTwice
|
|
|
|
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 ->
|
|
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", ->
|
|
@upstream._onConnect = (domain, port) ->
|
|
expect(domain).to.eq('localhost')
|
|
expect(port).to.eq('8444')
|
|
return true
|
|
|
|
request({
|
|
strictSSL: false
|
|
url: "https://localhost:8444/"
|
|
proxy: "http://localhost:3333"
|
|
}).then (res) =>
|
|
expect(res).to.contain("https server")
|
|
|
|
it "uses HTTP basic auth when provided", ->
|
|
@upstream.setAuth({
|
|
username: 'foo'
|
|
password: 'bar'
|
|
})
|
|
|
|
@upstream._onConnect = (domain, port) ->
|
|
expect(domain).to.eq('localhost')
|
|
expect(port).to.eq('8444')
|
|
return true
|
|
|
|
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(res).to.contain("https server")
|
|
|
|
it "closes outgoing connections when client disconnects", ->
|
|
@sandbox.spy(net, '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.connect.getCalls()
|
|
.find (call) =>
|
|
call.args[0].port == 9001 && call.args[0].host == "localhost"
|
|
.returnValue
|
|
|
|
new Promise (resolve) ->
|
|
socket.on 'close', =>
|
|
expect(socket.destroyed).to.be.true
|
|
resolve()
|
|
|
|
## https://github.com/cypress-io/cypress/issues/4257
|
|
it "passes through to SNI when it is intercepted and not through proxy", ->
|
|
createSocket = @sandbox.stub(network.connect, 'createRetryingSocket').callsArgWith(1, new Error('stub'))
|
|
createProxyConn = @sandbox.spy(network.agent.httpsAgent, 'createUpstreamProxyConnection')
|
|
|
|
request({
|
|
strictSSL: false
|
|
url: "https://localhost:8443"
|
|
proxy: "http://localhost:3333"
|
|
resolveWithFullResponse: true
|
|
forever: false
|
|
})
|
|
.then =>
|
|
throw new Error('should not succeed')
|
|
.catch { message: 'Error: Client network socket disconnected before secure TLS connection was established' }, =>
|
|
expect(createProxyConn).to.not.be.called
|
|
expect(createSocket).to.be.calledWith({
|
|
port: @proxy._sniPort
|
|
host: 'localhost'
|
|
})
|
|
|
|
afterEach ->
|
|
@upstream.stop()
|
|
delete process.env.HTTP_PROXY
|
|
delete process.env.HTTPS_PROXY
|
|
delete process.env.NO_PROXY
|