|
1 | 1 | import { |
2 | 2 | ALLOW_TEST_SUITE_WEBSITE, |
| 3 | + HAS_PROXY, |
3 | 4 | TEST_PRODUCTION, |
4 | 5 | TEST_SUITE_WEBSITE, |
5 | 6 | testIf, |
6 | 7 | } from "../lib"; |
7 | 8 | import { Identity, idmux, scrapeTimeout, scrape, scrapeRaw } from "./lib"; |
| 9 | +import https from "node:https"; |
| 10 | + |
| 11 | +const SELF_SIGNED_KEY = `-----BEGIN PRIVATE KEY----- |
| 12 | +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDCBJPpxbzPPuW8 |
| 13 | +DxlXh4JXR56Qq7hT74yiD+PzZ2OznSnfpZOA2kmQ30ztuGNstr/oE5Ixwarcp+9P |
| 14 | +0tFz321TeN/6PNmSb0MPay8Q9xjvylMSao2ydATTyKumoF0nqZfHlgQNu6uYGan7 |
| 15 | +/8qmZcVIJ09oJP29vFTxP7S6Nk40klHlQyBAwtT+IoRqWvBztnu+5Xuy8cIQP4er |
| 16 | +WoKySMuuVsnU8kwwM+QbFKGipD1jnK1xUGaaUtNpStNqnUKwNtW4jsMRjR/FapPF |
| 17 | +p8hHxOGrgHtZJ7lqZHi60TdrnaPQjvwe+drswJIM9cIPkyzyd0FBlg+CPGkmlUAC |
| 18 | +4w0MjknjAgMBAAECggEAUyiXJWnlpYa1/UcTe5rPWQ2Pfz67AO75/jSFZbx41XGV |
| 19 | +kxBrCp2FTp0HYhTYOK6TzqskzELQM0efoT0hHWM0fsSea6lNMCCUQ7WTNNhUTeMQ |
| 20 | +fCJDnatwrj2ipQazJt7f+WHpVuGLiOPnIeXfPDb+uhBvTpocUAi697RwiCfimVEl |
| 21 | +wOcETyKjG+AdkHn1WqXdiduIQsmm3f8H4rJcGZo2OpyU33s0ZK2ReZhIkOEoyzp+ |
| 22 | +BX9cN8wnmiQc4M0DpcSOZYwn2OtLdsGirFasmhfDFMBgE+BS9W3knsMxd/zEtKTs |
| 23 | +UxTK6bfdCNJkE8fR0H0ozViFvl61fcPuBvyDeTorwQKBgQD3oSbHo6MfZ53vNbBu |
| 24 | +rfzoV35jnWUN34fkMo8YkGGIH1nPb7xlShg/zR6OL86wk6ADFO43UFEmbVDGxlCn |
| 25 | +OscA04pfKP/Zvb9EDVr/j5Ix1LiFlATbjkPPqZj3IRdIih0ycjKFHR/OtbpPoINT |
| 26 | +8CNs1/VYsgYh47t9fdApqdc4MQKBgQDIk4BGQfYc4Fzxpfhf7/IwA5AfTJip/H9f |
| 27 | +XAxVFJhANymaUdDxar9D7VdoSQYOL2BD7KzT0JeeFwvwavnVc0jATAgmi81D+EaF |
| 28 | +RX5DG5GoYSFD8aSnhu0dGF3QrPemaamlJdCYOd3of+b0wZhkCvVPcOy/bTdkOD9q |
| 29 | +F3gZacWyUwKBgQCcbbjJtJ1/YT1rt0bVJCP3wg2db/g+Y0684RN0OQDjtKpPWA5z |
| 30 | +DfNzmmgK+jhfY2JZkAdL+fjJhZTZfL3GZmMAKqHmq0e0jSEeJDGv70ozIGXQPEk1 |
| 31 | +SRGdRU3UD5tdv6HiFDHF1TgapMIlOwi7JZ+7SlE6znsBPZNbGvc82oWSgQKBgQDA |
| 32 | +rVEQLNUrsCwYxoLuRiW1Efck2gPdZ31EMbx3Dq2jIlqIsAezogPSUPEicOOsRL6J |
| 33 | +AZaUc1DywNjrPxh4f6Jnd6JsxOeOX7X+2F8OQDGQOp4mEr9FX0vwIzQb/cx4xA// |
| 34 | +YXAci5osepF2lXK6x/wXMDd9PIF1eMMSOzFX2E/dmQKBgCAfdmgO9yU1K2esVb8B |
| 35 | +vLPuFWNiQ1UvmDaV4DDc10JQH64R/yv7HsmRf5C+oPjUbgfXyn+SLdtaVKWtyDtk |
| 36 | +8ajWWfZ2tqtXT31VdeJLjkABT+BU9H3u5YyrSPNIcGMgNSLjmb/DuWaclrIT6+hL |
| 37 | +9g/pFxnn4mOVBYdX1GyDHhBD |
| 38 | +-----END PRIVATE KEY-----`; |
| 39 | + |
| 40 | +const SELF_SIGNED_CERT = `-----BEGIN CERTIFICATE----- |
| 41 | +MIICyTCCAbGgAwIBAgIJAMikv3+5vuPnMA0GCSqGSIb3DQEBCwUAMBQxEjAQBgNV |
| 42 | +BAMMCWxvY2FsaG9zdDAeFw0yNjA2MjIxNzQ0NThaFw0zNjA2MTkxNzQ0NThaMBQx |
| 43 | +EjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC |
| 44 | +ggEBAMIEk+nFvM8+5bwPGVeHgldHnpCruFPvjKIP4/NnY7OdKd+lk4DaSZDfTO24 |
| 45 | +Y2y2v+gTkjHBqtyn70/S0XPfbVN43/o82ZJvQw9rLxD3GO/KUxJqjbJ0BNPIq6ag |
| 46 | +XSepl8eWBA27q5gZqfv/yqZlxUgnT2gk/b28VPE/tLo2TjSSUeVDIEDC1P4ihGpa |
| 47 | +8HO2e77le7LxwhA/h6tagrJIy65WydTyTDAz5BsUoaKkPWOcrXFQZppS02lK02qd |
| 48 | +QrA21biOwxGNH8Vqk8WnyEfE4auAe1knuWpkeLrRN2udo9CO/B752uzAkgz1wg+T |
| 49 | +LPJ3QUGWD4I8aSaVQALjDQyOSeMCAwEAAaMeMBwwGgYDVR0RBBMwEYIJbG9jYWxo |
| 50 | +b3N0hwR/AAABMA0GCSqGSIb3DQEBCwUAA4IBAQCqlZaFVPZ69S25OVzEPiRClsEe |
| 51 | +NcpBmGwwEl3Yn+hmMXspBaubv2cHWKL+KRm3C9FicD/FqwTxjVqBmizZRFUETS/r |
| 52 | +vTBEKE2lwXUVUbMZtCJ+NPszXh00PFjHO/Z/1poG+ZiMEXWB+nYJRDxUIt5BmK9W |
| 53 | +GRxVxKHLId8rqcGyQk/hdjhg8xd9jINKN6T378ZHv1t+Z1WAWLwA4oZeiWwD7kEF |
| 54 | +3IDQNbcl65aq2Qw6IDw+6bnCLc54A3BiU7miHDlNiP9rgjqf3cYzutTiem8L7DbY |
| 55 | +SDXcSDjxdKJmewIopBnycE2rAU4/O7AivhFA0iqQ/KAD27s6l/7rtO+LH6za |
| 56 | +-----END CERTIFICATE-----`; |
8 | 57 |
|
9 | 58 | describe("V2 Scrape skipTlsVerification Default", () => { |
10 | 59 | let identity: Identity; |
| 60 | + let tlsServer: https.Server; |
| 61 | + let selfSignedUrl: string; |
11 | 62 |
|
12 | 63 | beforeAll(async () => { |
13 | 64 | identity = await idmux({ |
14 | 65 | name: "v2-scrape-skip-tls", |
15 | 66 | concurrency: 100, |
16 | 67 | credits: 1000000, |
17 | 68 | }); |
| 69 | + |
| 70 | + tlsServer = https.createServer( |
| 71 | + { key: SELF_SIGNED_KEY, cert: SELF_SIGNED_CERT }, |
| 72 | + (_req, res) => { |
| 73 | + res.setHeader("Content-Type", "text/html; charset=utf-8"); |
| 74 | + res.end("<main><h1>Self-signed TLS fixture</h1></main>"); |
| 75 | + }, |
| 76 | + ); |
| 77 | + |
| 78 | + await new Promise<void>(resolve => { |
| 79 | + tlsServer.listen(0, "127.0.0.1", resolve); |
| 80 | + }); |
| 81 | + const address = tlsServer.address(); |
| 82 | + if (address === null || typeof address === "string") { |
| 83 | + throw new Error("Failed to start self-signed TLS fixture"); |
| 84 | + } |
| 85 | + selfSignedUrl = `https://127.0.0.1:${address.port}/`; |
18 | 86 | }, 10000); |
19 | 87 |
|
20 | | - test( |
| 88 | + afterAll(async () => { |
| 89 | + if (!tlsServer) { |
| 90 | + return; |
| 91 | + } |
| 92 | + await new Promise<void>((resolve, reject) => { |
| 93 | + tlsServer.close(err => (err ? reject(err) : resolve())); |
| 94 | + }); |
| 95 | + }); |
| 96 | + |
| 97 | + testIf(!HAS_PROXY)( |
21 | 98 | "should default skipTlsVerification to true in v2 API", |
22 | 99 | async () => { |
23 | 100 | const data = await scrape( |
24 | 101 | { |
25 | | - url: "https://expired.badssl.com/", |
| 102 | + url: selfSignedUrl, |
26 | 103 | maxAge: 0, |
27 | 104 | }, |
28 | 105 | identity, |
29 | 106 | ); |
30 | 107 |
|
31 | 108 | expect(data).toBeDefined(); |
32 | | - expect(data.markdown).toContain("badssl.com"); |
| 109 | + expect(data.markdown).toContain("Self-signed TLS fixture"); |
33 | 110 | }, |
34 | 111 | scrapeTimeout, |
35 | 112 | ); |
36 | 113 |
|
37 | | - test( |
| 114 | + testIf(!HAS_PROXY)( |
38 | 115 | "should allow explicit skipTlsVerification: false override", |
39 | 116 | async () => { |
40 | 117 | const response = await scrapeRaw( |
41 | 118 | { |
42 | | - url: "https://expired.badssl.com/", |
| 119 | + url: selfSignedUrl, |
43 | 120 | skipTlsVerification: false, |
44 | 121 | maxAge: 0, |
45 | 122 | }, |
|
0 commit comments