0 | module Node.HTTP.Request
  1 |
  2 | import Node
  3 | import Node.Internal.Support
  4 | import Node.HTTP.Agent
  5 | import public Node.HTTP.Headers
  6 | import public Node.Net.Socket.Type
  7 | import public Node.Net.Socket.Connect
  8 |
  9 | public export
 10 | record Options h where
 11 |   constructor MkOptions
 12 |   agent: Maybe Agent
 13 |   auth: Maybe String
 14 |   -- TODO: createConnection
 15 |   defaultPort: Maybe Int
 16 |   family: IpAddressFamily
 17 |   headers: Maybe h
 18 |   -- TODO: hints
 19 |   -- host: use `hostname` instead
 20 |   hostname: Maybe String
 21 |   insecureHTTPParser: Bool
 22 |   localAddress: Maybe String
 23 |   localPort: Maybe Int
 24 |   -- TODO: lookup
 25 |   maxHeaderSize: Maybe Int
 26 |   method: String
 27 |   path: Maybe String
 28 |   port: Maybe Int
 29 |   protocol: String
 30 |   setHost: Bool
 31 |   socketPath: Maybe String
 32 |   timeout: Maybe Int
 33 |   -- TODO: signal
 34 |
 35 | export
 36 | defaultOptions : Options h
 37 | defaultOptions = MkOptions
 38 |   { agent = Nothing
 39 |   , auth = Nothing
 40 |   , defaultPort = Nothing
 41 |   , family = Both
 42 |   , headers = Nothing
 43 |   , hostname = Nothing
 44 |   , insecureHTTPParser = False
 45 |   , localAddress = Nothing
 46 |   , localPort = Nothing
 47 |   , maxHeaderSize = Nothing
 48 |   , method = "GET"
 49 |   , path = Nothing
 50 |   , port = Nothing
 51 |   , protocol = "http:"
 52 |   , setHost = True
 53 |   , socketPath = Nothing
 54 |   , timeout = Nothing
 55 |   }
 56 |
 57 | %foreign """
 58 |   node:lambda:
 59 |   ( headersType
 60 |   , agent
 61 |   , auth
 62 |   , defaultPort
 63 |   , family
 64 |   , headers
 65 |   , hostname
 66 |   , insecureHTTPParser
 67 |   , localAddress
 68 |   , localPort
 69 |   , maxHeaderSize
 70 |   , method
 71 |   , path
 72 |   , port
 73 |   , protocol
 74 |   , setHost
 75 |   , socketPath
 76 |   , timeout
 77 |   ) => _keepDefined({
 78 |     agent: _maybe(agent),
 79 |     auth: _maybe(auth),
 80 |     defaultPort: _maybe(defaultPort),
 81 |     family,
 82 |     headers: _maybe(headers),
 83 |     hostname: _maybe(hostname),
 84 |     insecureHTTPParser: _bool(insecureHTTPParser),
 85 |     localAddress: _maybe(localAddress),
 86 |     localPort: _maybe(localPort),
 87 |     maxHeaderSize: _maybe(maxHeaderSize),
 88 |     method,
 89 |     path: _maybe(path),
 90 |     port: _maybe(port),
 91 |     protocol,
 92 |     setHost: _bool(setHost),
 93 |     socketPath: _maybe(socketPath),
 94 |     timeout: _maybe(timeout)
 95 |   })
 96 |   """
 97 | ffi_convertOptions :
 98 |   (agent: Maybe Agent)
 99 |   -> (auth: Maybe String)
100 |   -> (defaultPort: Maybe Int)
101 |   -> (family: Int)
102 |   -> (headers: Maybe h)
103 |   -> (hostname: Maybe String)
104 |   -> (insecureHTTPParser: Bool)
105 |   -> (localAddress: Maybe String)
106 |   -> (localPort: Maybe Int)
107 |   -> (maxHeaderSize: Maybe Int)
108 |   -> (method: String)
109 |   -> (path: Maybe String)
110 |   -> (port: Maybe Int)
111 |   -> (protocol: String)
112 |   -> (setHost: Bool)
113 |   -> (socketPath: Maybe String)
114 |   -> (timeout: Maybe Int)
115 |   -> Node $ Request.Options h
116 |
117 | export
118 | convertOptions : Options h -> Node $ Options h
119 | convertOptions o = ffi_convertOptions
120 |   o.agent
121 |   o.auth
122 |   o.defaultPort
123 |   (familyAsInt o.family)
124 |   o.headers
125 |   o.hostname
126 |   o.insecureHTTPParser
127 |   o.localAddress
128 |   o.localPort
129 |   o.maxHeaderSize
130 |   o.method
131 |   o.path
132 |   o.port
133 |   o.protocol
134 |   o.setHost
135 |   o.socketPath
136 |   o.timeout
137 |
138 | namespace Command
139 |
140 |   public export
141 |   record Options (t : SocketType) where
142 |     constructor MkOptions
143 |     request: Request.Options Headers
144 |     socket: Maybe $ Connect.options t
145 |
146 |   export
147 |   defaultOptions : {auto t : SocketType } -> Command.Options t
148 |   defaultOptions = MkOptions
149 |     { request = defaultOptions
150 |     , socket = Nothing
151 |     }
152 |
153 |   %foreign """
154 |     node:lambda:
155 |     ( ty
156 |     , request
157 |     , socket
158 |     ) => ({
159 |       ..._maybe(socket),
160 |       ...request
161 |     })
162 |     """
163 |   ffi_convertOptions :
164 |     (request : Node $ Request.Options Headers)
165 |     -> (socket : Maybe AnyPtr)
166 |     -> Node $ Command.Options t
167 |
168 |   export
169 |   convertOptions : (t : SocketType) -> Command.Options t -> Node $ Command.Options t
170 |   convertOptions t o = ffi_convertOptions
171 |     (convertOptions o.request)
172 |     (believe_me $ convertOptions t <$> o.socket)
173 |
174 |