@@ -2,5 +2,101 @@ module Test.Main where
22
33import 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+
530main :: 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
0 commit comments