Skip to content

Commit e3b0758

Browse files
Merge pull request #7115 from Shopify/fix-flaky-http-reverse-proxy
Fix flaky test on http-reverse-proxy.test.ts
2 parents 5eca6a9 + 47f29f4 commit e3b0758

File tree

1 file changed

+54
-56
lines changed

1 file changed

+54
-56
lines changed

packages/app/src/cli/utilities/app/http-reverse-proxy.test.ts

Lines changed: 54 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ const each = ['http', 'https'] as const
1212
describe.sequential.each(each)('http-reverse-proxy for %s', (protocol) => {
1313
const test = getTestReverseProxy(protocol)
1414
const wsProtocol = protocol === 'http' ? 'ws' : 'wss'
15-
const agent = protocol === 'http' ? undefined : new https.Agent({rejectUnauthorized: false})
15+
const agent =
16+
protocol === 'http'
17+
? new http.Agent({keepAlive: false})
18+
: new https.Agent({ca: localhostCert.cert, keepAlive: false})
1619

1720
test('routes requests to the correct target based on path', {retry: 2}, async ({ports, servers}) => {
1821
const response1 = await fetch(`${protocol}://localhost:${ports.proxyPort}/path1/test`, {agent})
@@ -44,8 +47,9 @@ describe.sequential.each(each)('http-reverse-proxy for %s', (protocol) => {
4447
ws.on('message', (data) => {
4548
expect(String(data)).toBe('Echo: Hello, WebSocket!')
4649
ws.close()
47-
wss.close()
48-
resolve()
50+
})
51+
ws.on('close', () => {
52+
wss.close(() => resolve())
4953
})
5054
ws.on('error', reject)
5155
})
@@ -97,8 +101,8 @@ function getTestReverseProxy(protocol: 'http' | 'https') {
97101
res.end('Response from target server 2')
98102
})
99103

100-
await new Promise<void>((resolve) => targetServer1.listen(ports.targetPort1, resolve))
101-
await new Promise<void>((resolve) => targetServer2.listen(ports.targetPort2, resolve))
104+
await new Promise<void>((resolve) => targetServer1.listen(ports.targetPort1, 'localhost', resolve))
105+
await new Promise<void>((resolve) => targetServer2.listen(ports.targetPort2, 'localhost', resolve))
102106

103107
const abortController = new AbortController()
104108
const {server: proxyServer} = await getProxyingWebServer(
@@ -111,11 +115,14 @@ function getTestReverseProxy(protocol: 'http' | 'https') {
111115
protocol === 'https' ? localhostCert : undefined,
112116
)
113117

114-
await new Promise<void>((resolve) => proxyServer.listen(ports.proxyPort, resolve))
118+
await new Promise<void>((resolve) => proxyServer.listen(ports.proxyPort, 'localhost', resolve))
115119
await use({targetServer1, targetServer2, proxyServer, abortController})
116120

121+
proxyServer.closeAllConnections()
117122
await new Promise<void>((resolve) => proxyServer.close(() => resolve()))
123+
targetServer1.closeAllConnections()
118124
await new Promise<void>((resolve) => targetServer1.close(() => resolve()))
125+
targetServer2.closeAllConnections()
119126
await new Promise<void>((resolve) => targetServer2.close(() => resolve()))
120127
},
121128
})
@@ -124,59 +131,50 @@ function getTestReverseProxy(protocol: 'http' | 'https') {
124131
const localhostCert = {
125132
key:
126133
'-----BEGIN PRIVATE KEY-----\n' +
127-
'MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC4f3TBaM5/O2KI\n' +
128-
'n9FIlwJ+g/6Tm9GPOF/Lme21lvIgXSRi0zr1hkhTmbHiQ6R9sdlrtYP+F63sK9lI\n' +
129-
'BeUzwc0SWt4CWEU/gd41SrDDl6hp2NY0H/oucmDVpq0nH7e/57vwNBvMeWS83rJ5\n' +
130-
'm3TqwEzzXnYwZOq/2nqpnKHZHizzhLa4vBYpVRGXaE61ldtZai+knSizx6I10FyC\n' +
131-
'eLZblCT0zNFaM6ObJjbpZEvx6BAig9lZreEVY4QxqIWZfXOICnQMyLhajIh1PW8K\n' +
132-
'UhLLKf6xTfZOx1O9gr8PdVrkNq+7FvglrwyBV0Eb2/NcL8T8EeFAoYt4kLAfxfwT\n' +
133-
'eXhaOuKDAgMBAAECggEBAKHtA10Ijkvuo+FDWxw5pS/CyzlkBX2Mvc7lD1NT4rfy\n' +
134-
'549w0otQysPM3em28nR7FlbJHcpxn+zq4y2qNurBCio05CrsrAI8Cfl9zzwrK92S\n' +
135-
'ORXQhvQi4MhDHC99T/k2+qSsJ0XDuV1mmv/OJ8Qs+JyUaGi6+aleqE+asBXtvQgQ\n' +
136-
'EWJHLLmGwzlnIj2Nc9qmH06QGOjoXOn3o4xLLz09CxEo987HzZv+Kw2Fci+XfEoj\n' +
137-
'OcezlrW5QbVR60aWJUrQu/Mmljpqsw8pQeKn9iWlyK8G+AvdvYgRjhcvEjVZcD0f\n' +
138-
'ue+C2MvVT1QCOiQtl3DDuFk2sy/YlakRT0/bxzPv/uECgYEA5p7IcsAnpohNicyq\n' +
139-
'wUJazFMuvGpUk6HiwnNFKZhNJXGkWTgNN6eZ9eEHGuYeTNdLTK65cHiQ3Q+ChhMz\n' +
140-
'rVnia4dPV6gLY15PjXbffRXJTPUetXcVW3nupdzSU7EO3o4ayhQ96/tzxUsvSPQE\n' +
141-
'd1PV5HS6ZbzSVwLLZLlXRdoEAlMCgYEAzM1G5u3pu6bPRN+XT6iFxbzmknOgppcT\n' +
142-
'pyvkTFrTtKn49m18AuywuQ+EvwzN6nh5LbLyWKKgcUuM75EI5ZNjM7UCfAG8eHum\n' +
143-
'1HXLEfJ6LpZJ0/80fUUHcAzL1bp3prRhTLbxOKtjx2ZnDlURY3tZKCoY7mHKmT/X\n' +
144-
'Y5AdopD8+RECgYEAkULyf1UJpJu2O1XvOEvTZV//0C4pl9QgQNradZi4/xzVqFzl\n' +
145-
'9mhbUcSr9QV9kGkLxQFJTM6kcJmUXV867bXwKErSbyQqCC0fbruxidhvM0oyTZr0\n' +
146-
'mOn0qASvdofQFd7sgNy/JCT+hwcUgZ8yMPddgskDn5GP676W3prfnd/1JoECgYAf\n' +
147-
'+yZJRXmsXf4b6TZ9r/lDyZ3P3NKHcSwWfNonuj85BRnlkW8+HavzGiNGmj9FkA6M\n' +
148-
'Pldt0+duCbg2aNWU1BE3r9p1dufxgI2qu8I8STsfL0TUIBQYQ8FHlBf4hifNFnnj\n' +
149-
'OuYsTUdFig4pxMr0V/yyMvC1uPukNr3xxD18d1upoQKBgQCOqyzwuXXZp0gDTuOC\n' +
150-
'c5hyjAhwxpppLvXt0bHZJ8AqSnRDFjMBjY+4s9hgaRFMjbcB4n0DZNQFKeECtcfm\n' +
151-
'gZGMPEvoMptrUbG4licNClEhgZJ1BDb5zQv0no2m9AAr5XYVCbAVyQAhhLfYZNMo\n' +
152-
'CIgUuvwT3ewgoTn8UsPOsgkmRA==\n' +
134+
'MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCpAmXYsXgC0K9l\n' +
135+
'aAknNZPdxG2/sA4EC4+Ez7fe+nvMn3vmFE+loesu2IAOYrqJPJvN9vGGr0Vs3P1u\n' +
136+
'6zcDV7NSWSAvO8BT5InLnOFWIeF5clq7wc1mk4lrcM4fJtJocdnmRZxpbWaDTa7a\n' +
137+
'/seQliQrr5Skw7VWuFkp3lqOLu2XXXVcbZ7+Ya7wzMej9wXAfRwZO8dfg/pwhxfe\n' +
138+
'jwfxz/wKjfEewFAQ2vOdQKw6ju+sLnCDXCcnmlifYWlvoDnl06Q9jc7kz/rwr0d9\n' +
139+
'2nxJDx/G4XA8LfrBO257P4FMilwPwpb8OgrSoxQRqD89b7eOXcjsYqiZDOR4mEz2\n' +
140+
'gg0DqSmdAgMBAAECggEAR41uVPl9l6OGPmZ3SZRTT9ZzqG3+4ROL5WyTqeFePFlg\n' +
141+
'+R2sQrF0glbCkFSYKLXyOJbN1nmp6Nb+rNEEb3PXxYtaJuUjHeFpvTxj4jVh4irZ\n' +
142+
'4xe/wCfCTCxr96BWAEYDPIxIFhJtDjX7S1gGYV5PXfdt9PuucFKH3UP4Dq4rhKMq\n' +
143+
'L5DE70ipk93G66cKwMnfzlPpjnKDMesq+GNLTotzOl0n7v7N2rwgZlbEoHznOFcn\n' +
144+
'zA510COtiWksL3LVORnEYdMzUWlPxWM+t3ONDZlXByC0qJEf3toiNwzYi2wpLqUP\n' +
145+
'iq5sKALCG+CJzTp2myH3Tb8Zsx49mP/scDJE0rCueQKBgQDdT36ZrBmi3/YWAgqt\n' +
146+
'RG2FQugN4Ec//WzTWpqhldy9rZBJEiOiMKdBXGn3R6llv7Ft18ZR/EFq7ID84Gva\n' +
147+
'XcTGDEZlehW9u3b83z3qIfntfUpMNNt8v/aaKrSD7e861PGpqePJXbgg1p7ls7vt\n' +
148+
'Gjf9bHhm9rmtXQ8pijzpVMVXEwKBgQDDgDhLIQinGps2VYcW9YzmF2nsvOzikA1c\n' +
149+
'V67ogq0ftt9V0iCXt8V3JMd5Xt7ALtLj0uzI8qVKXDbcti/Fq4jGIia4hQ3lA5cQ\n' +
150+
'0WkZvEqAbpwbSd28P10RIAnSWlY4ZkCj9FZNpnS4TdDZa4wns3R5lsZVUlAbyRd0\n' +
151+
'NaRwt08ijwKBgQDIx3Mi9dj4RFmdE9Md6OO3r8CZvizF6CQQB7Yb/LscNledg2Bi\n' +
152+
'p+NF0BKu7gvILMZK0iSxgrrSx6gqQ2x12vZHeyFutPj+fhHwTpR8UsDM7gs24gly\n' +
153+
'vzF6Il5NBtMwO7rXYzMuH+GJoUzdNle7Pzsmpn8BYruHhdLYq/qg8XBrkwKBgHhW\n' +
154+
'MFBuYPka83caZjDHrJbkypqiH93FdbPldRBBf3cKBaa51L4OrEmOJgqbTtlU+RKq\n' +
155+
'/n0ifoOrB0oMCpPN5j6vPs5NeCQDdbUwcVUaBXHQo95YNVhuWEb2RZVpbbEBn8BL\n' +
156+
'4eOiFi5sF6X9ASRe3c8J88MJC65OtVUev71x2BAZAoGBAKCMcgjTJwS7avupT3D/\n' +
157+
'/ZY2Nz4+Ro7xv3OrquEDPGF9IOjxUph7yedwtX/Ybwnh/Wu6HYmJnK5S4zsijgp9\n' +
158+
'CNEakriug3FXzamyXzGQFlVXrz5/RGqraGFeElrqt4hv1iPe1aiVGFLSc//4cLrA\n' +
159+
'jZPjgaaFbRALJQJ6i5luC2LP\n' +
153160
'-----END PRIVATE KEY-----\n',
154161
cert:
155162
'-----BEGIN CERTIFICATE-----\n' +
156-
'MIIEVDCCArygAwIBAgIQIbaylXp1Twug/Ne2DltDXDANBgkqhkiG9w0BAQsFADCB\n' +
157-
'jTEeMBwGA1UEChMVbWtjZXJ0IGRldmVsb3BtZW50IENBMTEwLwYDVQQLDChyaWNo\n' +
158-
'YXJkcG93ZWxsQFJpY2hhcmRzLU1hY0Jvb2stUHJvLmxvY2FsMTgwNgYDVQQDDC9t\n' +
159-
'a2NlcnQgcmljaGFyZHBvd2VsbEBSaWNoYXJkcy1NYWNCb29rLVByby5sb2NhbDAe\n' +
160-
'Fw0yNTAzMDQxOTAyMTJaFw0yNzA2MDQxODAyMTJaMF4xJzAlBgNVBAoTHm1rY2Vy\n' +
161-
'dCBkZXZlbG9wbWVudCBjZXJ0aWZpY2F0ZTEzMDEGA1UECwwqcmljaGFyZHBvd2Vs\n' +
162-
'bEBSaWNoYXJkcy1NYWNCb29rLVByby0yLmxvY2FsMIIBIjANBgkqhkiG9w0BAQEF\n' +
163-
'AAOCAQ8AMIIBCgKCAQEAuH90wWjOfztiiJ/RSJcCfoP+k5vRjzhfy5nttZbyIF0k\n' +
164-
'YtM69YZIU5mx4kOkfbHZa7WD/het7CvZSAXlM8HNElreAlhFP4HeNUqww5eoadjW\n' +
165-
'NB/6LnJg1aatJx+3v+e78DQbzHlkvN6yeZt06sBM8152MGTqv9p6qZyh2R4s84S2\n' +
166-
'uLwWKVURl2hOtZXbWWovpJ0os8eiNdBcgni2W5Qk9MzRWjOjmyY26WRL8egQIoPZ\n' +
167-
'Wa3hFWOEMaiFmX1ziAp0DMi4WoyIdT1vClISyyn+sU32TsdTvYK/D3Va5Davuxb4\n' +
168-
'Ja8MgVdBG9vzXC/E/BHhQKGLeJCwH8X8E3l4WjrigwIDAQABo14wXDAOBgNVHQ8B\n' +
169-
'Af8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwHwYDVR0jBBgwFoAUpeI4lDvc\n' +
170-
'Yw09VrPC4ME+I0EjA0AwFAYDVR0RBA0wC4IJbG9jYWxob3N0MA0GCSqGSIb3DQEB\n' +
171-
'CwUAA4IBgQBhqZUbVSIVboIXxa3OFKctXi7PqsRId8D7KibIpEUjBegvgzIxpuqB\n' +
172-
'+5p7HZc7IZxEz7pD5wm7CCcw8CwnBSQOem+3YkrJtNzeTv+Le/YFWYYeCBb+38gR\n' +
173-
'9IAJT4BQXJr5vmBSYsqG0q9UXKXsLkA8FOscr2r6B+h3lF1e+NZlMHcMOFu9NJPO\n' +
174-
'n6suL6ap9jdtslqWCspkUy9xKMmya3lv7FbXKe48IyhazxVNUemZrEW/m6GZkCFx\n' +
175-
'IZnwtN9JV33IkE7w/+HHdomCCDpKsvGtX+KJxajnNaCawyP1k3+cMRQWPyp1ceUe\n' +
176-
'hMDQsOoGSZAVQGT7uCaUXcmphQedlJqhrFbqV2xUoU+XS+ASti3LdoQiRO8COAAV\n' +
177-
'4jT234BS7zHSJXcg+dmocKqOeRf5J5b+XwAkQs+qEgWSgHYsju5srNle4wd341PY\n' +
178-
'fbw6iqA335rMbN/+jBGZ2ixrrro7lc3RKI0oayLHT1QnszQdZy+SAfV3a++nwbkC\n' +
179-
'Sad3b/7iWHY=\n' +
163+
'MIICwzCCAaugAwIBAgIJALZpjza1rNWnMA0GCSqGSIb3DQEBCwUAMBQxEjAQBgNV\n' +
164+
'BAMMCWxvY2FsaG9zdDAeFw0yNjAzMjYxODQzMjhaFw0zNjAzMjMxODQzMjhaMBQx\n' +
165+
'EjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\n' +
166+
'ggEBAKkCZdixeALQr2VoCSc1k93Ebb+wDgQLj4TPt976e8yfe+YUT6Wh6y7YgA5i\n' +
167+
'uok8m8328YavRWzc/W7rNwNXs1JZIC87wFPkicuc4VYh4XlyWrvBzWaTiWtwzh8m\n' +
168+
'0mhx2eZFnGltZoNNrtr+x5CWJCuvlKTDtVa4WSneWo4u7ZdddVxtnv5hrvDMx6P3\n' +
169+
'BcB9HBk7x1+D+nCHF96PB/HP/AqN8R7AUBDa851ArDqO76wucINcJyeaWJ9haW+g\n' +
170+
'OeXTpD2NzuTP+vCvR33afEkPH8bhcDwt+sE7bns/gUyKXA/Clvw6CtKjFBGoPz1v\n' +
171+
't45dyOxiqJkM5HiYTPaCDQOpKZ0CAwEAAaMYMBYwFAYDVR0RBA0wC4IJbG9jYWxo\n' +
172+
'b3N0MA0GCSqGSIb3DQEBCwUAA4IBAQB2vd2s4NKoApN57AN507SEO7eU1sJLl0xG\n' +
173+
'I1NCel8sSSjO6gkjx3HOxX5hPekjPVoPDA/o4KDUfJG16wGkiow7A9HL9LVcG5J5\n' +
174+
'pSFSS885joDu79uZfEPixbo7SGjAKG0SnJ5WbXz9JDIDenO8zuMCPKIE1hchsEpV\n' +
175+
'2MQ4f2tKK7qS1MI67Uu/U2I+2v32GB4PvGVSmpDbk09larAi/rnJM32cLIM5QamF\n' +
176+
'XsgFQapfZCLV9TJo3nAm7Z0BoQN707YrJZDiky4kVQXk2jog+Qr7v+h9pTh5lOob\n' +
177+
'Kr3LCBfGnbLLYljudOKEyx1ZyVB7Lv7kgAtQ8FmgycN327xsrxVj\n' +
180178
'-----END CERTIFICATE-----\n',
181179
certPath: 'localhost.pem',
182180
}

0 commit comments

Comments
 (0)