package dream-httpaf
Internal: shared http/af stack for Dream (server) and Hyper (client)
Install
Dune Dependency
Authors
Maintainers
Sources
dream-1.0.0-alpha6.tar.gz
sha256=8d3b6344c0e175aca628b3d5bb8ee58265e8c1074fc2d40d63f136fef83daf90
doc/src/dream-httpaf.dream-websocketaf/websocket.ml.html
Source file websocket.ml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
module Httpaf = Dream_httpaf_.Httpaf module IOVec = Httpaf.IOVec module Opcode = struct type standard_non_control = [ `Continuation | `Text | `Binary ] type standard_control = [ `Connection_close | `Ping | `Pong ] type standard = [ standard_non_control | standard_control ] type t = [ standard | `Other of int ] let code = function | `Continuation -> 0x0 | `Text -> 0x1 | `Binary -> 0x2 | `Connection_close -> 0x8 | `Ping -> 0x9 | `Pong -> 0xa | `Other code -> code let code_table : t array = [| `Continuation ; `Text ; `Binary ; `Other 0x3 ; `Other 0x4 ; `Other 0x5 ; `Other 0x6 ; `Other 0x7 ; `Connection_close ; `Ping ; `Pong ; `Other 0xb ; `Other 0xc ; `Other 0xd ; `Other 0xe ; `Other 0xf |] let unsafe_of_code code = Array.unsafe_get code_table code let of_code code = if code > 0xf then None else Some (Array.unsafe_get code_table code) let of_code_exn code = if code > 0xf then failwith "Opcode.of_code_exn: value can't fit in four bits"; Array.unsafe_get code_table code let to_int = code let of_int = of_code let of_int_exn = of_code_exn let pp_hum fmt t = Format.fprintf fmt "%d" (to_int t) end module Close_code = struct type standard = [ `Normal_closure | `Going_away | `Protocol_error | `Unsupported_data | `No_status_rcvd | `Abnormal_closure | `Invalid_frame_payload_data | `Policy_violation | `Message_too_big | `Mandatory_ext | `Internal_server_error | `TLS_handshake ] type t = [ standard | `Other of int ] let code = function | `Normal_closure -> 1000 | `Going_away -> 1001 | `Protocol_error -> 1002 | `Unsupported_data -> 1003 | `No_status_rcvd -> 1005 | `Abnormal_closure -> 1006 | `Invalid_frame_payload_data -> 1007 | `Policy_violation -> 1008 | `Message_too_big -> 1009 | `Mandatory_ext -> 1010 | `Internal_server_error -> 1011 | `TLS_handshake -> 1015 | `Other code -> code let code_table : t array = [| `Normal_closure ; `Going_away ; `Protocol_error ; `Unsupported_data ; `Other 1004 ; `No_status_rcvd ; `Abnormal_closure ; `Invalid_frame_payload_data ; `Policy_violation ; `Message_too_big ; `Mandatory_ext ; `Internal_server_error ; `Other 1012 ; `Other 1013 ; `Other 1014 ; `TLS_handshake |] let unsafe_of_code code = Array.unsafe_get code_table code let of_code code = if code > 0xffff || code < 1000 then None else if code < 1016 then Some (unsafe_of_code (code land 0b1111)) else Some (`Other code) ;; let of_code_exn code = if code > 0xffff then failwith "Close_code.of_code_exn: value can't fit in two bytes"; if code < 1000 then failwith "Close_code.of_code_exn: value in invalid range 0-999"; if code < 1016 then unsafe_of_code (code land 0b1111) else `Other code ;; let to_int = code let of_int = of_code let of_int_exn = of_code_exn let of_bigstring bs ~off = (* Close code takes 2 bytes *) if Bigstringaf.length bs - off - 2 < 0 then None else let code_int = Bigstringaf.get_int16_be bs off in of_int code_int let of_bigstring_exn bs ~off = (* Close code takes 2 bytes *) if Bigstringaf.length bs - off - 2 < 0 then failwith "Close_code.of_bigstring_exn: can't read 2 bytes from bigstring" else let code_int = Bigstringaf.get_int16_be bs off in of_int_exn code_int end module Frame = struct let apply_mask mask ?(off=0) ~src_off ?len bs = let len = match len with | None -> Bigstringaf.length bs | Some n -> n in for i = off to off + len - 1 do let j = (i + src_off - off) mod 4 in (* let j = (i - off) mod 4 in *) let c = Bigstringaf.unsafe_get bs i |> Char.code in let c = c lxor Int32.(logand (shift_right mask (8 * (3 - j))) 0xffl |> to_int) in Bigstringaf.unsafe_set bs i (Char.unsafe_chr c) done ;; let apply_mask_bytes mask bs ~src_off ~off ~len = for i = off to off + len - 1 do (* let j = (i - off) mod 4 in *) let j = (i + src_off - off) mod 4 in let c = Bytes.unsafe_get bs i |> Char.code in let c = c lxor Int32.(logand (shift_right mask (8 * (3 - j))) 0xffl |> to_int) in Bytes.unsafe_set bs i (Char.unsafe_chr c) done ;; end
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>