diff options
author | polwex <polwex@sortug.com> | 2025-06-27 08:24:37 +0700 |
---|---|---|
committer | polwex <polwex@sortug.com> | 2025-06-27 08:24:37 +0700 |
commit | f0ada28815f35f160f0e85101728d215c0f7d7f9 (patch) | |
tree | 7eb39633d934094346745d87af436d1de39c1383 /lib/http.ml | |
parent | ba350f124bab36766af6c71ba5e3dc17f33fb5ab (diff) |
m
Diffstat (limited to 'lib/http.ml')
-rw-r--r-- | lib/http.ml | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/lib/http.ml b/lib/http.ml new file mode 100644 index 0000000..e8e7db4 --- /dev/null +++ b/lib/http.ml @@ -0,0 +1,89 @@ +open Piaf + +(* open Result_syntax *) +open Eio.Std + +type mode = + | Hx + | HxSwap + | Server + +let query_param uri param = + match Uri.query uri |> List.assoc_opt param with + | Some [ param ] -> Some param + | _ -> None +;; + +let send_raw_html ?(headers = []) ?(status = `OK) body = + let headers = + Headers.(of_list ([ Well_known.content_type, "text/html; charset=utf-8" ] @ headers)) + in + Response.of_string ~headers ~body status +;; + +let piaf_config = { Piaf.Config.default with follow_redirects = true } + +(* let get env ~headers ~sw url = *) +(* TODO: curl-style debug logging *) +(* let result = *) +(* let* response = *) +(* Client.Oneshot.get ~headers ~config:piaf_config ~sw env (Uri.of_string url) *) +(* in *) +(* let body = Body.to_string response.body in *) +(* if Status.is_successful response.status *) +(* then body *) +(* else *) +(* let* body = body in *) +(* let message = Status.to_string response.status in *) +(* Error (`Msg (Format.sprintf "%s %s" message body)) *) +(* in *) +(* result |> Result.map_error Error.to_string *) +(* ;; *) + +(* let post env ~body ~headers ~sw url = *) +(* TODO: curl-style debug logging *) +(* let result = *) +(* let* response = *) +(* Client.Oneshot.post ~headers ~body ~config:piaf_config ~sw env (Uri.of_string url) *) +(* in *) +(* let body = Body.to_string response.body in *) +(* if Status.is_successful response.status *) +(* then body *) +(* else *) +(* let* body = body in *) +(* let message = Status.to_string response.status in *) +(* Error (`Msg (Format.sprintf "%s %s" message body)) *) +(* in *) +(* result |> Result.map_error Error.to_string *) +(* ;; *) + +(* let parse_form_body ctx = *) +(* let result = *) +(* let+ body = ctx.Piaf.Server.request.body |> Body.to_string in *) +(* body *) +(* |> String.split_on_char '&' *) +(* |> List.filter_map (fun pair -> *) +(* match pair |> String.split_on_char '=' with *) +(* | [ key; value ] -> *) +(* let key = Uri.pct_decode key in *) +(* let value = Uri.pct_decode value in *) +(* Some (key, value) *) +(* | parts -> *) +(* traceln "Ignoring invalid param %s" (String.concat "," parts); *) +(* None) *) +(* in *) +(* result |> Result.map_error (Fmt.to_to_string Piaf.Error.pp_hum) *) +(* ;; *) + +let form_field field params = + params + |> List.assoc_opt field + |> Option.to_result ~none:(Format.sprintf "Missing %s field" field) +;; + +let handle_error result = + result + |> Result.fold ~ok:Fun.id ~error:(fun error -> + traceln "Failed handling request %s" error; + Piaf.Response.create `Internal_server_error) +;; |