summaryrefslogtreecommitdiffstats
path: root/examples/client.js
blob: 737b381d46472207a2f1fcdb6b4060960deb2cf7 (plain)
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)
})