@@ -4,24 +4,26 @@ import Prelude
4
4
5
5
import Control.Monad.ST.Class (liftST )
6
6
import Control.Monad.ST.Ref as ST.Ref
7
+ import Data.Either (Either (..))
7
8
import Data.Foldable (for_ )
8
9
import Data.Maybe (Maybe (..), fromMaybe )
9
10
import Effect (Effect )
10
11
import Effect.Console as Console
11
- import Effect.Exception (throwException )
12
+ import Effect.Exception (Error , throwException )
12
13
import Node.Encoding as Node.Encoding
13
14
import Node.HTTP2 (headerKeys , headerString , sensitiveHeaders , toHeaders , toOptions )
14
15
import Node.HTTP2.Client as HTTP2.Client
15
16
import Node.HTTP2.Server as HTTP2.Server
16
17
import Node.Stream as Node.Stream
17
18
import Node.URL as URL
19
+ import Test.MockCert (cert , key )
18
20
import Unsafe.Coerce (unsafeCoerce )
19
21
20
- basic_serverSecure :: Effect Unit
21
- basic_serverSecure = do
22
+ basic_serverSecure :: ( Either Error Unit -> Effect Unit ) -> Effect Unit
23
+ basic_serverSecure complete = do
22
24
23
25
server <- HTTP2.Server .createSecureServer
24
- (toOptions { key: mockKey , cert: mockCert })
26
+ (toOptions { key: key , cert: cert })
25
27
26
28
void $ HTTP2.Server .onceStreamSecure server \stream _ _ -> do
27
29
HTTP2.Server .respond stream
@@ -41,7 +43,9 @@ basic_serverSecure = do
41
43
Node.Stream .end (HTTP2.Server .toDuplex stream)
42
44
$ case _ of
43
45
Just err -> throwException err
44
- Nothing -> HTTP2.Server .closeServerSecure server (pure unit)
46
+ Nothing -> do
47
+ HTTP2.Server .closeServerSecure server (pure unit)
48
+ complete (Right unit)
45
49
46
50
HTTP2.Server .listenSecure server
47
51
(toOptions { port: 8443 })
@@ -52,7 +56,7 @@ basic_client = do
52
56
53
57
clientsession <- HTTP2.Client .connect
54
58
(URL .parse " https://localhost:8443" )
55
- (toOptions { ca: mockCert })
59
+ (toOptions { ca: cert })
56
60
(\_ _ -> pure unit)
57
61
58
62
clientstream <- HTTP2.Client .request clientsession
@@ -88,63 +92,3 @@ headers_sensitive = do
88
92
{ " cookie" : " some-cookie"
89
93
, " other-sensitive-header" : " very secret data"
90
94
}
91
-
92
- -- https://letsencrypt.org/docs/certificates-for-localhost/#making-and-trusting-your-own-certificates
93
- --
94
- -- Generate localhost.crt and localhost.key with 10 year expiration:
95
- --
96
- -- openssl req -x509 -out localhost.crt -keyout localhost.key -newkey rsa:2048 -nodes -sha256 -days 3650 -subj '/CN=localhost' -extensions EXT -config <( printf "[dn]\nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")
97
- --
98
-
99
- mockCert :: String
100
- mockCert =
101
- """ -----BEGIN CERTIFICATE-----
102
- MIIDDzCCAfegAwIBAgIUUyn89RHpZC9irOiqJpcBqFRw2HgwDQYJKoZIhvcNAQEL
103
- BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTIyMTExODAyMTkyN1oXDTMyMTEx
104
- NTAyMTkyN1owFDESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEF
105
- AAOCAQ8AMIIBCgKCAQEA0REkgizCB39n47Z3JXcW+GPPym4MXBb9HAHBJbH1+m/R
106
- 0EkdunDyXr8cKveABgq3/kazWjXlGwNXUklKYCydcnmtNVBub4s1wXAsegRaPMmo
107
- RzisW7FWaqcLcBMAuwrub2NTVsX0HtO5qZiEKNx6AAbWFizFmMQ9K/9VprT1OLWy
108
- vtIOlR/YK+PKruNWeNpvhx91zmwb69lgrqUcwMHguLWgoz0JJgzh7cerexbT+eKC
109
- CuA9Ub8ctQD8SIl3eF7OzsvmQHSr+yABo3TJj7UZLh0B3j1uB8RLQvenVilc4YPz
110
- MK/R6Jf8RjRssGommbUqVaXRjJfYQ2As2tkzRS90cwIDAQABo1kwVzAUBgNVHREE
111
- DTALgglsb2NhbGhvc3QwCwYDVR0PBAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMB
112
- MB0GA1UdDgQWBBS5+ngK++/FbHQ4Uf8qMZDK6tSNlDANBgkqhkiG9w0BAQsFAAOC
113
- AQEAj5nTUka4P/hWkV+Wa9Rp/ijqv2ah2ukU1u73QyprG2/gHmFpYvNFJ7lG9O9r
114
- Wuvsz4g4moX9kgt/9GnpUbZBUE7zPau74P06lFcXhKAhiZcpsS+CZbMIsbfilWS0
115
- SBbs8OTLvexOqPP4pTvlc67zPkuB3tjOnHhPar8VSAiBp2s0l6UF2vWZ69Xj3ice
116
- DadE6thrH41GN/OSROKWL6dEueNTuQaU1Rx9Nxh8hvKiDJZ7l8oiHGYERoGwJJro
117
- tWBqRvX/C4TpnS+ckhOyqrHUXN66lVaact9GaBd7n6oCKzDY/GtENCLJnNKte5VI
118
- SATt1Hpnw3S/zwX9imqABqneAA==
119
- -----END CERTIFICATE-----"""
120
-
121
- mockKey :: String
122
- mockKey =
123
- """ -----BEGIN PRIVATE KEY-----
124
- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDRESSCLMIHf2fj
125
- tncldxb4Y8/KbgxcFv0cAcElsfX6b9HQSR26cPJevxwq94AGCrf+RrNaNeUbA1dS
126
- SUpgLJ1yea01UG5vizXBcCx6BFo8yahHOKxbsVZqpwtwEwC7Cu5vY1NWxfQe07mp
127
- mIQo3HoABtYWLMWYxD0r/1WmtPU4tbK+0g6VH9gr48qu41Z42m+HH3XObBvr2WCu
128
- pRzAweC4taCjPQkmDOHtx6t7FtP54oIK4D1Rvxy1APxIiXd4Xs7Oy+ZAdKv7IAGj
129
- dMmPtRkuHQHePW4HxEtC96dWKVzhg/Mwr9Hol/xGNGywaiaZtSpVpdGMl9hDYCza
130
- 2TNFL3RzAgMBAAECggEAJggqTgv6WAbTTVdaIVSitxjhKgAO+4mrDbc7/bF7/8zr
131
- rCpA4DO/w4CcjSxs+6xjgDw4UEbRoLJg5jUy9H/pPHPqEHLLRDtc0g2n6aJ1D+3X
132
- UO18XUnLYKd2qzKpxVzdtyGofXaRTDJT6gg2soA5KVwVAf+vCnVYc3KFkEgG/AOt
133
- jhvbxK+xA4CGjGPYxASO5K3IVJxb419hi8dizgtdJaotysvfspth5WOOoiBtVhuB
134
- 6ORZt9DbN1AK9U3nV76NsjHeQWcMsDqt8w/KRkok4X9rkQ86pylZcDUyoqkf+aYB
135
- 09FgDiw2iSj9k6kkR0y1o/sRsCN7PoRmJgEhrRWPcQKBgQDlflzyoaVUCIAZQAMo
136
- O3vJE/AEOnvB+eHmqGSi6nGHUxJavxm8dxJRqY2fzA/VeVvp19Nxs1Eh8pskHav4
137
- n+syRtGzkKIE0x9/KThhgzbqZl+NT5afHMhUHvmepMf8J+71giMC2v2yQC0aFVi7
138
- 3frv3YNuBbC69FWkeYOjq/MJZwKBgQDpNs6nYmtR3bLBWKoLSOTLGV8Bhhhzt+tu
139
- nm6LVA464ib039m5BoWne890InxgaDNHfuL++n473JFXuwQMBBY3YLD3OPa5uW4a
140
- gt+oYUJKh+qGio395GnZ0W/Sf5GBpdPJ+pTMqGqlo/NWSPuwCdMd5T6RfvnEJzzv
141
- 0/jZCAJ5FQKBgCE2yaMADBp+ZHPDFPHksgSnEwy5niGz1aL5ah8+CRJJzpU9pS7m
142
- mMsi2/Ftqjj+KHROnTaOekaMgzGV7ca89mA/aagwXZKPL7bKs3NBd1gzWs7r3uPG
143
- WaP7G6t/M8ZlzSrRG9oU8bSznxNwVXhTJzdB+vyYbDySkjaMs6WjhDgvAoGBAJj0
144
- mE8R7r9Pv1it9UDXey91oWkXcNwciW4QvQHmjDq0bsZ2No7ypyA0xNgvchGs5c0D
145
- fI+s7LQIMs8uWjYjTArgAND0bGVdJ8h9g4Ek4NyPDhNVtlEJyR7SDRwrDNzSTPiQ
146
- v50G7INc51D1JxXLK8rUutekRt4Ouhm1leWKKk0NAoGBALvc9wF7XcgGHZa1RRk9
147
- jH0vOkrn632Epzml1mXg0//2mw+7iQP3q5KtRruaIk6ifLSHznzqAkowhKFH+iCH
148
- wnecLhsl5FnL0JAipIxBHdX0iTttJf4UR/2wTo3RalGjEcMjMCUrSdkhBjRH4Gdc
149
- fBuXFtwhIuiggNR7UlHxbYpq
150
- -----END PRIVATE KEY-----"""
0 commit comments