~/bend-docscommunity

http.bend fails

raw source on the hub · import 0xa74be722130dca68310c18dc011b13c7/http.bend as Http

1 import
import Base

Types

type Req source · line 7 · raw

Data

type Res source · line 10 · raw

Data

type Fields source · line 13 · raw

Data

type HexSize source · line 209 · raw

Data

type Step source · line 212 · raw

Data

Definitions

def empty source · line 17 · raw

Map<&2, String>

def sanitize.cons source · line 20 · raw

@ch:Char -> @rest:String -> @drop:Bool -> String

def sanitize source · line 27 · raw

@s:String -> String

def drop_cr.if source · line 34 · raw

@+s:String -> @cr:Bool -> String

def drop_cr source · line 41 · raw

@+s:String -> String

def take_sp.go source · line 44 · raw

@s:String -> @+acc:String -> Pair(String, String)

def take_sp source · line 51 · raw

@s:String -> Pair(String, String)

def start_line.ver source · line 54 · raw

@m:String -> @pv:Pair(String, String) -> Pair(String, Pair(String, String))

def start_line.rest source · line 58 · raw

@mr:Pair(String, String) -> Pair(String, Pair(String, String))

def start_line source · line 62 · raw

@s:String -> Pair(String, Pair(String, String))

def split_at_blank.go source · line 65 · raw

@s:String -> @e:Bool -> @w:U32 -> @acc:String -> Pair(String, String)

def split_at_blank source · line 77 · raw

@s:String -> Pair(String, String)

def split_colon.go source · line 80 · raw

@s:String -> @+acc:String -> Pair(String, String)

def split_colon source · line 87 · raw

@s:String -> Pair(String, String)

def has_header.of source · line 90 · raw

@r:Pair(Map<&2, String>, Bool) -> Bool

def has_header source · line 94 · raw

@+h:Map<&2, String> -> @k:String -> Bool

def header.of source · line 97 · raw

@r:Pair(Map<&2, String>, String) -> String

def folded source · line 104 · raw

@+line:String -> Bool

def tracked source · line 107 · raw

@+k:String -> Bool

def fields_put.dup source · line 110 · raw

@m:Map<&2, String> -> @k:String -> @v:String -> @bad:Bool -> Fields

def fields_put.key source · line 117 · raw

@+m:Map<&2, String> -> @+k:String -> @v:String -> Fields

def fields_put.kv source · line 120 · raw

@m:Map<&2, String> -> @kv:Pair(String, String) -> Fields

def fields_put.fold source · line 124 · raw

@m:Map<&2, String> -> @line:String -> @fold:Bool -> Fields

def fields_put.empty source · line 131 · raw

@m:Map<&2, String> -> @+line:String -> @e:Bool -> Fields

def fields_put.ok source · line 138 · raw

@m:Map<&2, String> -> @+line:String -> Fields

def fields_put source · line 141 · raw

@acc:Fields -> @line:String -> Fields

def parse.headers.done source · line 148 · raw

@acc:Fields -> Maybe<&2, Map<&2, String>>

def parse.headers source · line 155 · raw

@xs:List<&2, String> -> @acc:Fields -> Maybe<&2, Map<&2, String>>

def parse_u32.digit source · line 162 · raw

@+c:U32 -> Bool

def parse_u32.add source · line 165 · raw

@acc:U32 -> @c:U32 -> U32

def parse_u32.done source · line 168 · raw

@acc:U32 -> @bad:Bool -> Maybe<&2, U32>

def parse_u32.go source · line 175 · raw

@s:String -> @acc:U32 -> @bad:Bool -> Maybe<&2, U32>

def parse_u32 source · line 182 · raw

@s:String -> Maybe<&2, U32>

def parse.take.if source · line 191 · raw

@+rest:String -> @+k:Nat -> @short:Bool -> Maybe<&2, String>

def parse.take.have source · line 199 · raw

@+rest:String -> @+k:Nat -> Maybe<&2, String>

RFC 9112 §8: fewer bytes than Content-Length is an incomplete message.

def parse.take source · line 202 · raw

@rest:String -> @n:Maybe<&2, U32> -> Maybe<&2, String>

def is_hex source · line 217 · raw

@+c:U32 -> Bool

def hexv source · line 220 · raw

@+c:U32 -> U32

def chunk.lf1 source · line 223 · raw

@r:String -> @n:U32 -> @lf:Bool -> Maybe<&2, HexSize>

def chunk.lf source · line 230 · raw

@t:String -> @n:U32 -> Maybe<&2, HexSize>

def chunk.ext source · line 238 · raw

@s:String -> @+n:U32 -> Maybe<&2, HexSize>

RFC 9112 §7.1.1: recipients ignore unknown chunk extensions.

def chunk.size.end source · line 245 · raw

@+c:U32 -> @+t:String -> @+n:U32 -> @seen:Bool -> Maybe<&2, HexSize>

def chunk.size.go source · line 252 · raw

@s:String -> @+acc:U32 -> @+seen:Bool -> Maybe<&2, HexSize>

def chunk.size source · line 259 · raw

@s:String -> Maybe<&2, HexSize>

def chunk.trailer.ok source · line 262 · raw

@acc:String -> @ok:Bool -> Step

def chunk.trailer.end source · line 269 · raw

@hb:Pair(String, String) -> @acc:String -> Step

def chunk.trailer.if source · line 273 · raw

@rest:String -> @acc:String -> @blank:Bool -> Step

def chunk.trailer source · line 281 · raw

@+rest:String -> @acc:String -> Step

ponytail: trailer fields are dropped unparsed (§7.1.2 allows discarding)

def chunk.crlf.if source · line 284 · raw

@data:String -> @+after:String -> @acc:String -> @ok:Bool -> Step

def chunk.crlf source · line 291 · raw

@data:String -> @+after:String -> @acc:String -> Step

def chunk.data.if source · line 294 · raw

@+rest:String -> @+k:Nat -> @acc:String -> @short:Bool -> Step

def chunk.data source · line 301 · raw

@+rest:String -> @+k:Nat -> @acc:String -> Step

def chunk.step.n source · line 304 · raw

@+n:U32 -> @rest:String -> @acc:String -> @zero:Bool -> Step

def chunk.step.got source · line 311 · raw

@got:Maybe<&2, HexSize> -> @acc:String -> Step

def chunk.step source · line 318 · raw

@s:String -> @acc:String -> Step

def chunk.go source · line 322 · raw

@fuel:Nat -> @st:Step -> Maybe<&2, String>

ponytail: acc ++ per chunk is O(body * chunks); a chunk list if bodies get big

def chunk.decode source · line 336 · raw

@+s:String -> Maybe<&2, String>

Every chunk eats at least 3 bytes, so length(s) steps always suffice.

def parse.body.cl source · line 339 · raw

@+h:Map<&2, String> -> @rest:String -> @hascl:Bool -> Maybe<&2, String>

def parse.body.chunked.eq source · line 346 · raw

@rest:String -> @ok:Bool -> Maybe<&2, String>

def parse.body.chunked.val source · line 353 · raw

@te:String -> @rest:String -> Maybe<&2, String>

def parse.body.chunked source · line 356 · raw

@+h:Map<&2, String> -> @rest:String -> @hascl:Bool -> Maybe<&2, String>

def parse.body.te source · line 363 · raw

@+h:Map<&2, String> -> @rest:String -> @te:Bool -> Maybe<&2, String>

def parse.body source · line 370 · raw

@+h:Map<&2, String> -> @rest:String -> Maybe<&2, String>

def parse.finish source · line 373 · raw

@method:String -> @path:String -> @h:Map<&2, String> -> @body:Maybe<&2, String> -> Maybe<&2, Req>

def parse.host source · line 380 · raw

@method:String -> @path:String -> @+h:Map<&2, String> -> @rest:String -> @has:Bool -> Maybe<&2, Req>

def parse.fields source · line 387 · raw

@method:String -> @path:String -> @rest:String -> @fs:Maybe<&2, Map<&2, String>> -> Maybe<&2, Req>

def target_ok source · line 394 · raw

@+p:String -> Bool

def parse.target source · line 397 · raw

@method:String -> @+path:String -> @headers:List<&2, String> -> @rest:String -> @ok:Bool -> Maybe<&2, Req>

def parse.ver source · line 404 · raw

@method:String -> @+path:String -> @v:String -> @headers:List<&2, String> -> @rest:String -> @ok:Bool -> Maybe<&2, Req>

def parse.empty_method source · line 411 · raw

@method:String -> @path:String -> @+v:String -> @headers:List<&2, String> -> @rest:String -> @empty:Bool -> Maybe<&2, Req>

def parse.start3 source · line 418 · raw

@mpv:Pair(String, Pair(String, String)) -> @headers:List<&2, String> -> @rest:String -> Maybe<&2, Req>

def parse.lines source · line 422 · raw

@xs:List<&2, String> -> @rest:String -> Maybe<&2, Req>

def parse.head source · line 429 · raw

@head:String -> @rest:String -> Maybe<&2, Req>

def parse.of source · line 432 · raw

@hb:Pair(String, String) -> Maybe<&2, Req>

def parse source · line 436 · raw

@raw:String -> Maybe<&2, Req>

def parse.res.cl source · line 439 · raw

@+h:Map<&2, String> -> @rest:String -> @hascl:Bool -> Maybe<&2, String>

def parse.res.te source · line 446 · raw

@+h:Map<&2, String> -> @rest:String -> @te:Bool -> Maybe<&2, String>

def parse.res.body source · line 453 · raw

@+h:Map<&2, String> -> @rest:String -> Maybe<&2, String>

def parse.res.finish source · line 456 · raw

@status:U32 -> @h:Map<&2, String> -> @body:Maybe<&2, String> -> Maybe<&2, Res>

def parse.res.fields source · line 463 · raw

@status:U32 -> @rest:String -> @fs:Maybe<&2, Map<&2, String>> -> Maybe<&2, Res>

def parse.res.num source · line 470 · raw

@code:Maybe<&2, U32> -> @headers:List<&2, String> -> @rest:String -> Maybe<&2, Res>

def parse.res.ver source · line 477 · raw

@ver:String -> @code:String -> @headers:List<&2, String> -> @rest:String -> @ok:Bool -> Maybe<&2, Res>

def parse.res.start3 source · line 484 · raw

@mpv:Pair(String, Pair(String, String)) -> @headers:List<&2, String> -> @rest:String -> Maybe<&2, Res>

def parse.res.lines source · line 488 · raw

@xs:List<&2, String> -> @rest:String -> Maybe<&2, Res>

def parse.res.head source · line 495 · raw

@head:String -> @rest:String -> Maybe<&2, Res>

def parse.res.of source · line 498 · raw

@hb:Pair(String, String) -> Maybe<&2, Res>

def parse_res source · line 502 · raw

@raw:String -> Maybe<&2, Res>

def res_body.res source · line 505 · raw

@res:Res -> String

def res_body source · line 509 · raw

@m:Maybe<&2, Res> -> String

def got_body.req source · line 516 · raw

@req:Req -> String

def got_body source · line 520 · raw

@m:Maybe<&2, Req> -> String

def body.of source · line 527 · raw

@hb:Pair(String, String) -> String

def body source · line 531 · raw

@s:String -> String

def headers_block.go source · line 534 · raw

@xs:List<&2, Sigma<&2, &2, String, _ => String>> -> @acc:String -> String

def headers_block source · line 541 · raw

@h:Map<&2, String> -> String

def response source · line 544 · raw

@status:U32 -> @headers:Map<&2, String> -> @body:String -> String

def nat_u32 source · line 547 · raw

@n:Nat -> U32

def encode source · line 554 · raw

@r:Res -> String

def request source · line 558 · raw

@method:String -> @path:String -> @headers:Map<&2, String> -> @body:String -> String

def encode_req source · line 561 · raw

@method:String -> @path:String -> @host:String -> @+body:String -> String

def fetch_tail source · line 565 · raw

@head:String -> @m:Pair(Socket, Result<&1, &1, Pair(U32, String), String>) -> IO(Maybe<&2, Res>)

ponytail: two recvs; loop when bodies exceed 16KiB

def fetch_head source · line 572 · raw

@m:Pair(Socket, Result<&1, &1, Pair(U32, String), String>) -> IO(Maybe<&2, Res>)

def fetch_sent source · line 579 · raw

@m:Pair(Socket, Result<&1, &1, Pair(U32, String), Unit>) -> IO(Maybe<&2, Res>)

def fetch source · line 586 · raw

@method:String -> @ip:String -> @port:U32 -> @host:String -> @path:String -> @body:String -> IO(Maybe<&2, Res>)

def get_body.res source · line 592 · raw

@res:Res -> String

def get_body source · line 596 · raw

@m:Maybe<&2, Res> -> String

def get source · line 603 · raw

@ip:String -> @port:U32 -> @host:String -> @path:String -> IO(String)

def sent_fin source · line 608 · raw

@m:Pair(Socket, Result<&1, &1, Pair(U32, String), Unit>) -> IO(Unit)

def reply_send source · line 612 · raw

@s:Socket -> @res:Res -> IO(Unit)

Templates

template reply_handle source · line 617 · raw

@-h:(@_:Req -> IO(Res)) -> @s:Socket -> @req:Req -> IO(Unit)

template reply_parsed source · line 622 · raw

@-h:(@_:Req -> IO(Res)) -> @s:Socket -> @m:Maybe<&2, Req> -> IO(Unit)

template reply_ok source · line 629 · raw

@-h:(@_:Req -> IO(Res)) -> @s:Socket -> @raw:String -> IO(Unit)

template reply source · line 632 · raw

@-h:(@_:Req -> IO(Res)) -> @m:Pair(Socket, Result<&1, &1, Pair(U32, String), String>) -> IO(Unit)

template talk source · line 640 · raw

@-h:(@_:Req -> IO(Res)) -> @s:Socket -> IO(Unit)

template conn source · line 645 · raw

@-h:(@_:Req -> IO(Res)) -> @m:Pair(Listener, Result<&1, &1, Pair(U32, String), Socket>) -> IO(Listener)

template serve source · line 659 · raw

@-h:(@_:Req -> IO(Res)) -> @+port:U32 -> IO(Unit)

Unsafe

unsafe loop source · line 653 · raw

@-h:(@_:Req -> IO(Res)) -> @l:Listener -> IO(Unit)