1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
'use strict'
const {createInterface} = require('readline')
const {request} = require('..')
// https://gemini.circumlunar.space/docs/spec-spec.txt, 1.4.3
// > Interactive clients for human users MUST inform users that such a session
// > has been requested and require the user to approve generation of such a
// > certificate. Transient certificates MUST NOT be generated automatically.
const letUserConfirmClientCertUsage = ({host, reason}, cb) => {
const prompt = createInterface({
input: process.stdin,
output: process.stdout,
history: 0,
})
prompt.question([
`Send client cert to ${host}?`,
reason ? ` Server says: "${reason}".` : '',
' y/n > '
].join(''), (confirmed) => {
prompt.close()
cb(confirmed === 'y' || confirmed === 'Y')
})
}
const onError = (err) => {
console.error(err)
process.exit(1)
}
request('/bar', {
followRedirects: true,
useClientCerts: true, letUserConfirmClientCertUsage,
tlsOpt: {
rejectUnauthorized: false,
},
}, (err, res) => {
if (err) return onError(err)
console.log(res.statusCode, res.statusMessage)
if (res.meta) console.log(res.meta)
res.pipe(process.stdout)
})
|