Skip to content

Commit 0b2fc0e

Browse files
committed
re-writing tests
1 parent 56b649f commit 0b2fc0e

File tree

9 files changed

+166
-239
lines changed

9 files changed

+166
-239
lines changed

CHANGELOG.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ Breaking changes:
88

99
New features:
1010

11+
- New module `HTTP2`. Solves #44. (#45 by @jamesdbrock)
12+
- Use __spec__ for tests. Upgraded `ci.yml`. Solves #35. (#45 by @jamesdbrock)
13+
- New function `HTTP.onRequest`. Solves #46. (#45 by @jamesdbrock)
14+
1115
Bugfixes:
1216

1317
Other improvements:
@@ -32,7 +36,7 @@ New features:
3236
Other improvements:
3337
- Migrated CI to GitHub Actions, updated installation instructions to use Spago, and migrated from `jshint` to `eslint` (#30)
3438
- Added a changelog and pull request template (#34)
35-
39+
3640
## [v5.0.2](https://github.com/purescript-node/purescript-node-http/releases/tag/v5.0.2) - 2019-07-24
3741

3842
- Relaxed upper bounds on `node-buffer`

spago.dhall

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
, "newtype"
1616
, "node-buffer"
1717
, "node-net"
18+
, "node-process"
1819
, "node-streams"
1920
, "node-streams-aff"
2021
, "node-url"

src/Node/HTTP.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,16 @@ export function onUpgrade(server) {
6464
};
6565
}
6666

67+
export function onRequest(server) {
68+
return function (cb) {
69+
return function () {
70+
server.on("request", function (req, res) {
71+
return cb(req)(res)();
72+
});
73+
};
74+
};
75+
}
76+
6777
export function setHeader(res) {
6878
return function (key) {
6979
return function (value) {

src/Node/HTTP.purs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ module Node.HTTP
1212
, listenSocket
1313
, onConnect
1414
, onUpgrade
15+
, onRequest
1516

1617
, httpVersion
1718
, requestHeaders
@@ -77,6 +78,9 @@ foreign import onConnect :: Server -> (Request -> Socket -> Buffer -> Effect Uni
7778
-- | Listen to `upgrade` events on the server
7879
foreign import onUpgrade :: Server -> (Request -> Socket -> Buffer -> Effect Unit) -> Effect Unit
7980

81+
-- | Listen to `request` events on the server
82+
foreign import onRequest :: Server -> (Request -> Response -> Effect Unit) -> Effect Unit
83+
8084
-- | Get the request HTTP version
8185
httpVersion :: Request -> String
8286
httpVersion = _.httpVersion <<< unsafeCoerce

test/HTTP2.purs

Lines changed: 10 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,26 @@ import Prelude
44

55
import Control.Monad.ST.Class (liftST)
66
import Control.Monad.ST.Ref as ST.Ref
7+
import Data.Either (Either(..))
78
import Data.Foldable (for_)
89
import Data.Maybe (Maybe(..), fromMaybe)
910
import Effect (Effect)
1011
import Effect.Console as Console
11-
import Effect.Exception (throwException)
12+
import Effect.Exception (Error, throwException)
1213
import Node.Encoding as Node.Encoding
1314
import Node.HTTP2 (headerKeys, headerString, sensitiveHeaders, toHeaders, toOptions)
1415
import Node.HTTP2.Client as HTTP2.Client
1516
import Node.HTTP2.Server as HTTP2.Server
1617
import Node.Stream as Node.Stream
1718
import Node.URL as URL
19+
import Test.MockCert (cert, key)
1820
import Unsafe.Coerce (unsafeCoerce)
1921

20-
basic_serverSecure :: Effect Unit
21-
basic_serverSecure = do
22+
basic_serverSecure :: (Either Error Unit -> Effect Unit) -> Effect Unit
23+
basic_serverSecure complete = do
2224

2325
server <- HTTP2.Server.createSecureServer
24-
(toOptions { key: mockKey, cert: mockCert })
26+
(toOptions { key: key, cert: cert })
2527

2628
void $ HTTP2.Server.onceStreamSecure server \stream _ _ -> do
2729
HTTP2.Server.respond stream
@@ -41,7 +43,9 @@ basic_serverSecure = do
4143
Node.Stream.end (HTTP2.Server.toDuplex stream)
4244
$ case _ of
4345
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)
4549

4650
HTTP2.Server.listenSecure server
4751
(toOptions { port: 8443 })
@@ -52,7 +56,7 @@ basic_client = do
5256

5357
clientsession <- HTTP2.Client.connect
5458
(URL.parse "https://localhost:8443")
55-
(toOptions { ca: mockCert })
59+
(toOptions { ca: cert })
5660
(\_ _ -> pure unit)
5761

5862
clientstream <- HTTP2.Client.request clientsession
@@ -88,63 +92,3 @@ headers_sensitive = do
8892
{ "cookie": "some-cookie"
8993
, "other-sensitive-header": "very secret data"
9094
}
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-----"""

test/HTTP2Aff.purs

Lines changed: 5 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import Node.HTTP2.Client.Aff as Client.Aff
1717
import Node.HTTP2.Server.Aff as Server.Aff
1818
import Node.Stream.Aff (end, fromStringUTF8, readAll, toStringUTF8, write)
1919
import Node.URL as URL
20+
import Test.MockCert (cert, key)
2021

2122
push1 :: Aff Unit
2223
push1 = parSequence_
@@ -30,7 +31,7 @@ push1_serverSecure = do
3031
either (\err -> throwError err *> pure unit) pure =<< attempt do
3132
-- 1. Start the server, wait for a connection.
3233
server <- Server.Aff.createSecureServer
33-
(toOptions { key: mockKey, cert: mockCert })
34+
(toOptions { key: key, cert: cert })
3435
void $ Server.Aff.listenSecure server
3536
(toOptions { port: 8444 })
3637
\_headers stream -> do
@@ -62,7 +63,7 @@ push1_client = do
6263

6364
-- 1. Begin the session, open a connection.
6465
session <- Client.Aff.connect
65-
(toOptions { ca: mockCert })
66+
(toOptions { ca: cert })
6667
(URL.parse "https://localhost:8444")
6768

6869
-- 2. Send a request.
@@ -101,7 +102,7 @@ headers_serverSecure = do
101102

102103
-- 1. Start the server, wait for a connection.
103104
server <- Server.Aff.createSecureServer
104-
(toOptions { key: mockKey, cert: mockCert })
105+
(toOptions { key: key, cert: cert })
105106
Server.Aff.listenSecure server
106107
(toOptions { port: 8444 })
107108
\headers stream -> do
@@ -140,7 +141,7 @@ headers_client = do
140141

141142
-- 1. Begin the session, open a connection.
142143
session <- Client.Aff.connect
143-
(toOptions { ca: mockCert })
144+
(toOptions { ca: cert })
144145
(URL.parse "https://localhost:8444")
145146

146147
-- 2. Send a request.
@@ -181,56 +182,3 @@ headersShow headers = String.joinWith ", " $ headerKeys headers <#> \key ->
181182
<|>
182183
(String.joinWith " " <$> headerArray headers key)
183184
)
184-
185-
mockCert :: String
186-
mockCert =
187-
"""-----BEGIN CERTIFICATE-----
188-
MIIDDzCCAfegAwIBAgIUUyn89RHpZC9irOiqJpcBqFRw2HgwDQYJKoZIhvcNAQEL
189-
BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTIyMTExODAyMTkyN1oXDTMyMTEx
190-
NTAyMTkyN1owFDESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEF
191-
AAOCAQ8AMIIBCgKCAQEA0REkgizCB39n47Z3JXcW+GPPym4MXBb9HAHBJbH1+m/R
192-
0EkdunDyXr8cKveABgq3/kazWjXlGwNXUklKYCydcnmtNVBub4s1wXAsegRaPMmo
193-
RzisW7FWaqcLcBMAuwrub2NTVsX0HtO5qZiEKNx6AAbWFizFmMQ9K/9VprT1OLWy
194-
vtIOlR/YK+PKruNWeNpvhx91zmwb69lgrqUcwMHguLWgoz0JJgzh7cerexbT+eKC
195-
CuA9Ub8ctQD8SIl3eF7OzsvmQHSr+yABo3TJj7UZLh0B3j1uB8RLQvenVilc4YPz
196-
MK/R6Jf8RjRssGommbUqVaXRjJfYQ2As2tkzRS90cwIDAQABo1kwVzAUBgNVHREE
197-
DTALgglsb2NhbGhvc3QwCwYDVR0PBAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMB
198-
MB0GA1UdDgQWBBS5+ngK++/FbHQ4Uf8qMZDK6tSNlDANBgkqhkiG9w0BAQsFAAOC
199-
AQEAj5nTUka4P/hWkV+Wa9Rp/ijqv2ah2ukU1u73QyprG2/gHmFpYvNFJ7lG9O9r
200-
Wuvsz4g4moX9kgt/9GnpUbZBUE7zPau74P06lFcXhKAhiZcpsS+CZbMIsbfilWS0
201-
SBbs8OTLvexOqPP4pTvlc67zPkuB3tjOnHhPar8VSAiBp2s0l6UF2vWZ69Xj3ice
202-
DadE6thrH41GN/OSROKWL6dEueNTuQaU1Rx9Nxh8hvKiDJZ7l8oiHGYERoGwJJro
203-
tWBqRvX/C4TpnS+ckhOyqrHUXN66lVaact9GaBd7n6oCKzDY/GtENCLJnNKte5VI
204-
SATt1Hpnw3S/zwX9imqABqneAA==
205-
-----END CERTIFICATE-----"""
206-
207-
mockKey :: String
208-
mockKey =
209-
"""-----BEGIN PRIVATE KEY-----
210-
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDRESSCLMIHf2fj
211-
tncldxb4Y8/KbgxcFv0cAcElsfX6b9HQSR26cPJevxwq94AGCrf+RrNaNeUbA1dS
212-
SUpgLJ1yea01UG5vizXBcCx6BFo8yahHOKxbsVZqpwtwEwC7Cu5vY1NWxfQe07mp
213-
mIQo3HoABtYWLMWYxD0r/1WmtPU4tbK+0g6VH9gr48qu41Z42m+HH3XObBvr2WCu
214-
pRzAweC4taCjPQkmDOHtx6t7FtP54oIK4D1Rvxy1APxIiXd4Xs7Oy+ZAdKv7IAGj
215-
dMmPtRkuHQHePW4HxEtC96dWKVzhg/Mwr9Hol/xGNGywaiaZtSpVpdGMl9hDYCza
216-
2TNFL3RzAgMBAAECggEAJggqTgv6WAbTTVdaIVSitxjhKgAO+4mrDbc7/bF7/8zr
217-
rCpA4DO/w4CcjSxs+6xjgDw4UEbRoLJg5jUy9H/pPHPqEHLLRDtc0g2n6aJ1D+3X
218-
UO18XUnLYKd2qzKpxVzdtyGofXaRTDJT6gg2soA5KVwVAf+vCnVYc3KFkEgG/AOt
219-
jhvbxK+xA4CGjGPYxASO5K3IVJxb419hi8dizgtdJaotysvfspth5WOOoiBtVhuB
220-
6ORZt9DbN1AK9U3nV76NsjHeQWcMsDqt8w/KRkok4X9rkQ86pylZcDUyoqkf+aYB
221-
09FgDiw2iSj9k6kkR0y1o/sRsCN7PoRmJgEhrRWPcQKBgQDlflzyoaVUCIAZQAMo
222-
O3vJE/AEOnvB+eHmqGSi6nGHUxJavxm8dxJRqY2fzA/VeVvp19Nxs1Eh8pskHav4
223-
n+syRtGzkKIE0x9/KThhgzbqZl+NT5afHMhUHvmepMf8J+71giMC2v2yQC0aFVi7
224-
3frv3YNuBbC69FWkeYOjq/MJZwKBgQDpNs6nYmtR3bLBWKoLSOTLGV8Bhhhzt+tu
225-
nm6LVA464ib039m5BoWne890InxgaDNHfuL++n473JFXuwQMBBY3YLD3OPa5uW4a
226-
gt+oYUJKh+qGio395GnZ0W/Sf5GBpdPJ+pTMqGqlo/NWSPuwCdMd5T6RfvnEJzzv
227-
0/jZCAJ5FQKBgCE2yaMADBp+ZHPDFPHksgSnEwy5niGz1aL5ah8+CRJJzpU9pS7m
228-
mMsi2/Ftqjj+KHROnTaOekaMgzGV7ca89mA/aagwXZKPL7bKs3NBd1gzWs7r3uPG
229-
WaP7G6t/M8ZlzSrRG9oU8bSznxNwVXhTJzdB+vyYbDySkjaMs6WjhDgvAoGBAJj0
230-
mE8R7r9Pv1it9UDXey91oWkXcNwciW4QvQHmjDq0bsZ2No7ypyA0xNgvchGs5c0D
231-
fI+s7LQIMs8uWjYjTArgAND0bGVdJ8h9g4Ek4NyPDhNVtlEJyR7SDRwrDNzSTPiQ
232-
v50G7INc51D1JxXLK8rUutekRt4Ouhm1leWKKk0NAoGBALvc9wF7XcgGHZa1RRk9
233-
jH0vOkrn632Epzml1mXg0//2mw+7iQP3q5KtRruaIk6ifLSHznzqAkowhKFH+iCH
234-
wnecLhsl5FnL0JAipIxBHdX0iTttJf4UR/2wTo3RalGjEcMjMCUrSdkhBjRH4Gdc
235-
fBuXFtwhIuiggNR7UlHxbYpq
236-
-----END PRIVATE KEY-----"""

test/Main.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)