A simple wrapper around OCurl.
Find a file
Christopher Zimmermann 1c489f0097 reset easy handle before use
One thing this does is reset the request method to the default, which
otherwise would be stuck at any request method previously set with
Curl.set_customrequest
2026-02-09 10:00:24 -05:00
.github/workflows CI: try to fix gh-pages 2026-01-20 21:10:01 -05:00
examples/argiope reformat with 0.27 2026-01-20 20:50:01 -05:00
src reset easy handle before use 2026-02-09 10:00:24 -05:00
test test: use tiny_httpd to not depend on external network 2026-01-21 22:21:39 -05:00
.gitignore initial commit 2019-09-13 18:22:56 -05:00
.ocamlformat CI: check format 2026-01-20 20:49:24 -05:00
argiope.sh feat: add an example, a simple web crawler that looks for deadlinks 2019-09-14 12:25:34 -05:00
CHANGELOG.md prepare for 0.3 2026-01-22 21:34:18 -05:00
dune reformat with 0.27 2026-01-20 20:50:01 -05:00
dune-project prepare for 0.3 2026-01-22 21:34:18 -05:00
ezcurl-lwt.opam prepare for 0.3 2026-01-22 21:34:18 -05:00
ezcurl.opam prepare for 0.3 2026-01-22 21:34:18 -05:00
LICENSE add license file (MIT) 2019-09-16 12:59:46 -05:00
Makefile CI: check format 2026-01-20 20:49:24 -05:00
README.md disable the mdx test 2026-01-22 21:34:18 -05:00

EZCurl build

A simple wrapper around OCurl, for easy tasks around http.

project goals

  • be as simple to use as possible.
  • be as reliable as possible (work is done by cURL and the ocurl bindings anyway).
  • stable API with few dependencies, so that user code compiles without breakage for a long time.

Installation

  • for the synchronous library: opam install ezcurl
  • for the lwt-based library: opam install ezcurl-lwt (depends on ezcurl)

Usage

A small web crawler can be found in examples/argiope. It's very incomplete and naive but demonstrates basic usage of Ezcurl_lwt.get.

Synchronous API

The library lives in a module Ezcurl, which wraps Curl.t with functions such as get that combine many different low level API calls into one. It also follows redirections by default, and returns a Ezcurl.response object that contains the body, headers, and error code.

# #require "ezcurl";;
# let url = "https://curl.haxx.se/";;
val url : string = "https://curl.haxx.se/"
# let res = Ezcurl.get ~url ();;
...
# let content = match res with Ok c -> c | Error (_,s) -> failwith s;;
val content : string Ezcurl_core.response =
...

# content.Ezcurl.code;;
- : int = 200

It is also possible to create a client with Ezcurl.make() and re-use it across calls with the optional parameter client.

Lwt API

Using ezcurl-lwt, a module Ezcurl_lwt becomes available, with functions that are similar to the ones in Ezcurl but are non blocking. This makes it easy to run several queries in parallel:

# #require "ezcurl-lwt";;

# let urls = [
  "https://en.wikipedia.org/wiki/CURL";
  "https://en.wikipedia.org/wiki/OCaml";
  "https://curl.haxx.se/";
  ];;
val urls : string list =
  ["https://en.wikipedia.org/wiki/CURL";
   "https://en.wikipedia.org/wiki/OCaml"; "https://curl.haxx.se/"]

# open Lwt.Infix;;
# let codes =
    List.map (fun url -> Ezcurl_lwt.get ~url ()) urls
    |> Lwt_list.map_p
    (fun fut ->
      fut >>= function
      | Ok r -> Lwt.return r.Ezcurl_lwt.code
      | Error e -> Lwt.fail (Failure "oh no"))
  ;;
...
# codes;;
- : int list = [200; 200; 200]