Skip to content

Commit 4f1a7d6

Browse files
Initial attempt at writing an example (broken)
Looks like Node doesn't like it when some options are `undefined`...
1 parent 114b97d commit 4f1a7d6

File tree

4 files changed

+167
-2
lines changed

4 files changed

+167
-2
lines changed

test.dhall

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,28 @@
11
{ name = "node-http2-tests"
22
, dependencies =
3-
[ "console", "effect", "node-event-emitter", "prelude", "spec" ]
3+
[ "arrays"
4+
, "console"
5+
, "datetime"
6+
, "effect"
7+
, "either"
8+
, "exceptions"
9+
, "foldable-traversable"
10+
, "foreign-object"
11+
, "functions"
12+
, "maybe"
13+
, "node-buffer"
14+
, "node-fs"
15+
, "node-net"
16+
, "node-path"
17+
, "node-streams"
18+
, "nullable"
19+
, "partial"
20+
, "prelude"
21+
, "refs"
22+
, "spec"
23+
, "typelevel-prelude"
24+
, "unsafe-coerce"
25+
]
426
, packages = ./packages.dhall
527
, sources = [ "src/**/*.purs", "test/**/*.purs" ]
628
}

test/Test/Main.purs

Lines changed: 97 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,101 @@ module Test.Main where
22

33
import Prelude
44

5+
import Data.Array as Array
6+
import Data.FoldableWithIndex (forWithIndex_, traverseWithIndex_)
7+
import Data.Maybe (Maybe(..))
8+
import Effect (Effect)
9+
import Effect.Class.Console (log)
10+
import Effect.Exception as Exception
11+
import Effect.Ref as Ref
12+
import Foreign.Object (Object)
13+
import Node.Buffer as Buffer
14+
import Node.Buffer.Immutable (ImmutableBuffer)
15+
import Node.Encoding (Encoding(..))
16+
import Node.FS.Sync as FS
17+
import Node.Http2.Client as Client
18+
import Node.Http2.Constants as NGHTTP2
19+
import Node.Http2.Server as Server
20+
import Node.Http2.Session as Session
21+
import Node.Http2.Stream (session, toDuplex)
22+
import Node.Http2.Stream as H2Stream
23+
import Node.Path as Path
24+
import Node.Stream as Stream
25+
import Unsafe.Coerce (unsafeCoerce)
26+
27+
unsafeToImmutableBuffer :: Buffer.Buffer -> Effect ImmutableBuffer
28+
unsafeToImmutableBuffer = Buffer.unsafeFreeze
29+
530
main :: Effect Unit
6-
main = pure unit
31+
main = do
32+
privateKey <- FS.readFile (Path.concat [ "test", "localhost-privkey.pem" ]) >>= unsafeToImmutableBuffer
33+
cert <- FS.readFile (Path.concat [ "test", "localhost-cert.pem" ]) >>= unsafeToImmutableBuffer
34+
server <- Server.createSecureServer
35+
( _
36+
{ key = Just [ privateKey ]
37+
, cert = Just [ cert ]
38+
}
39+
)
40+
Server.onCheckContinue server \req res -> do
41+
log "server - onCheckContinue"
42+
Server.onConnection server \duplex -> do
43+
log "server - onConnection"
44+
Server.onSession server \session -> do
45+
log "server - onSession"
46+
Server.onSessionError server \err session -> do
47+
log "server - onSessionError"
48+
log (unsafeCoerce err)
49+
Server.onStream server \stream headers flags rawHeaders -> do
50+
streamId <- H2Stream.id stream
51+
log $ "server - onStream for id: " <> show streamId
52+
forWithIndex_ (unsafeCoerce headers :: Object String) \k v ->
53+
log $ k <> ": " <> v
54+
log $ "server - onStream - Flags: " <> show flags
55+
log $ "server - onStream - Raw Headers: " <> show rawHeaders
56+
let duplex = H2Stream.toDuplex stream
57+
H2Stream.respond stream (unsafeCoerce { "an-http-header": "value" })
58+
{ endStream: true
59+
, waitForTrailers: false
60+
}
61+
void $ Stream.writeString duplex UTF8 "hello from server" (const mempty)
62+
void $ Stream.end duplex \_ -> do
63+
H2Stream.close stream NGHTTP2.noError
64+
65+
Server.onTimeout server do
66+
log "onTimeout"
67+
Server.onUnknownProtocol server \duplex -> do
68+
log "onUnknownProtocol"
69+
let httpsPort = 443
70+
Server.listen server
71+
( _
72+
{ port = Just httpsPort
73+
}
74+
)
75+
session <- Client.connect' ("https://localhost:" <> show httpsPort)
76+
(_ { ca = Just [ cert ] })
77+
Session.onError session \error ->
78+
log $ "Client session encountered error: " <> Exception.message error
79+
stream <- Session.request session
80+
( unsafeCoerce
81+
{ ":method": "GET"
82+
, ":path": "/"
83+
}
84+
)
85+
let duplex = toDuplex stream
86+
void $ Stream.end duplex (const mempty)
87+
H2Stream.onResponse stream \headers flags -> do
88+
log "client - onResponse"
89+
forWithIndex_ (unsafeCoerce headers :: Object String) \k v ->
90+
log $ k <> ": " <> v
91+
log $ "Flags: " <> show flags
92+
chunksRef <- Ref.new []
93+
Stream.onData duplex \buf ->
94+
Ref.modify_ (flip Array.snoc buf) chunksRef
95+
Stream.onEnd duplex do
96+
chunks <- Ref.read chunksRef
97+
buffer <- Buffer.concat chunks :: Effect Buffer.Buffer
98+
str <- Buffer.toString UTF8 buffer :: Effect String
99+
log $ "client - onResponse body: " <> show str
100+
H2Stream.close stream NGHTTP2.noError
101+
102+
Server.close server

test/localhost-cert.pem

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDCTCCAfGgAwIBAgIUXP5btASG8+hVETpcuFm9zvUv+E8wDQYJKoZIhvcNAQEL
3+
BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTIzMDYxMzE2MjcyMVoXDTIzMDcx
4+
MzE2MjcyMVowFDESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEF
5+
AAOCAQ8AMIIBCgKCAQEAnu6ejy4B8T7Z3oBa9pk+pwPliV6bwpjPYRzAN4NkuEVV
6+
1N5rnoTWGpWmgTD8oJkaopghZoDqEOxYuVs9bHmaiZID7pPydfgMkolrBwaHS15R
7+
/k5VizLPwYZJzdEvqnK4iqAM7JlCdJshZ6rDbOxtj7d/gbKEwqdWheTgOaEkPSO6
8+
/vtf1emCNDtvYGdNNkDFd1WoawVYRo3RXoGWxyrtC/dh7kW7jQbWZxxuzdYRSAVA
9+
LVja4jIn5Fhrno0bva3sIYjAoBiq/EYUsE1bUXrLW+lRYKSDUYE8jugJ8ZI2djTR
10+
IOedKecH4ymCYtSv9oIcjXTSA8Kwjm+t1SlrXUH86wIDAQABo1MwUTAdBgNVHQ4E
11+
FgQUpD9sHX3wId8wtXvY9t/vwQORB8gwHwYDVR0jBBgwFoAUpD9sHX3wId8wtXvY
12+
9t/vwQORB8gwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAF7dM
13+
/O9Y0PRG1CVPlT6MRdaAlkiHYXviQSuZusUD4PKD74InOh/FZsE/JQ8+8+mkv2eX
14+
2WXtettBBTJI7uZqgiyNVMxS5OwZjB/dm9MfnL8IDQjOSy+/C2QdjXPHG44zAfqx
15+
b2yf6aJGzo+7ETQSFYXGVmipdYHX5Gg1m+pKVQWE3zFiKoaTg20rSRDPfLf6jm0V
16+
WeAtk7Fb+x6Mc7QT3FR+E2auC9UhSPh2kbgMraZKSqxlLURF+WOJ888tQAEAcywu
17+
doJhKR7NYKqdpqrA+NCghrDgT8vFhddaRw/XLOTuGJd90yuDPGnggV/OCcNKdD3l
18+
nlNX0boLyIjFSbqvnQ==
19+
-----END CERTIFICATE-----

test/localhost-privkey.pem

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCe7p6PLgHxPtne
3+
gFr2mT6nA+WJXpvCmM9hHMA3g2S4RVXU3muehNYalaaBMPygmRqimCFmgOoQ7Fi5
4+
Wz1seZqJkgPuk/J1+AySiWsHBodLXlH+TlWLMs/BhknN0S+qcriKoAzsmUJ0myFn
5+
qsNs7G2Pt3+BsoTCp1aF5OA5oSQ9I7r++1/V6YI0O29gZ002QMV3VahrBVhGjdFe
6+
gZbHKu0L92HuRbuNBtZnHG7N1hFIBUAtWNriMifkWGuejRu9rewhiMCgGKr8RhSw
7+
TVtRestb6VFgpINRgTyO6AnxkjZ2NNEg550p5wfjKYJi1K/2ghyNdNIDwrCOb63V
8+
KWtdQfzrAgMBAAECggEAD902TLw+0f0mk5JqjtC0IGKzFkR9Arsf51jB1qi4Z7mQ
9+
CQjPydZtMq3uaiXg8Am1G9BYp40sEAovcjnckzsK+G48eaOHh7JkIUczPKCW5g7u
10+
Dn1BbHzjBpu1B6TSTIHzNrvyhLY1nA/iETsXEusBcqxSP2vgDms6p6NopSGXGiN4
11+
tmZoA3Vnltkrc9dfQNT+0RLOsu48gIMhFnHLfhxWmvJx1wFD1mlG5oGpLNiCUgk4
12+
MNQp10LIRAsYmioL3H2xqcbgTBNYPrALgmBWGN0OryJ128lj6Q2q5HOPd4R7MO9x
13+
LCGLqB4ekBgM+3PBaQYXrWW6T0K36Ec/eFgBV56V1QKBgQDDmfidbhli+6mUQ+6r
14+
K9wFVOK4aILOaIFPy2o18t3mmoIFQvGHUeoIb5VY8mX4ApQIZwQ1pFcOL9SCT++j
15+
JxHpfbiaA82XjejsqL2fwY0f19ggXRpaTWZp+zJp7Xu4V8U1TlHAagpMzlQ/pOsF
16+
2WMq5IstG1lai9g1NEmvbzoGDQKBgQDQAfyKYR7UVDofUhFND9nNDsSMOL5lXZh7
17+
pJiwkU+TeCj6Sxps8rcBh6l5BnhCZxx4HMFHCtMlvdqiKfDwIc4paSB6NaLwEZoj
18+
aDMy0F0T06K7vI2srd71SqgjkHVDFdRGijYKVGsGa7iDngp4vWBpFIadzjniRdMr
19+
5UnIXZCI1wKBgQChHtOL2oVO475sQwj2NsqmGaYoAO6+15atBAIZLlVa/yra6qnJ
20+
rc/54vBCtGkKQhVuVm1BQn3zUbLbJL1gx24Zx1WoiDlx/ZNAXj7Uubpl4IZHImny
21+
uI8D/ccpOlYPIz1vC3SL6s1RNyRuyIpP5yGo01lRbpXL4CXYrZmEyToigQKBgQDE
22+
H+tfCn3IE/aNi5LWh0iESRVXZTVYXCynACYb7ZcLY/O3M9MhwKR/I8vOWiRP7+ru
23+
8aXndzRpVJ5t4n/T2vwJHZ9Ku4H7O42LLvd/ROlOBXFd9EXc+D/OJmtsxQtbipyR
24+
OkYD7V7QOgdKylvzRhQ+X+Uhq832JIIc1F+CNX5PFwKBgDxGNLrvn6JEj7yKdud7
25+
0Jq3Hle7Xwsp2YSrmTIoF0z3CRovXaxb74ZeKctd4/qVo2BPD7Y0X2Mv4fhHXRjv
26+
nlovFyl+QO73IoVnPg5LNaiOLbJiq67aeZwxfNm9CSMW80dC56k6LVLNkPooboLA
27+
qJa24h6KBFVqBxJ2aDl0KU4h
28+
-----END PRIVATE KEY-----

0 commit comments

Comments
 (0)