ocurl从多请求句柄中的单个curl请求提取输出

ocurl从多请求句柄中的单个curl请求提取输出,curl,ocaml,Curl,Ocaml,我试图在一个脚本中同时启动多个HTTP请求。我正在使用ocurl库(它是libcurl的一个薄包装器),并试图从curl多句柄中读取信息 下面的示例使用了一个简单的curl句柄,效果非常好,可以将响应转储到stdout module C = Curl ;; let get_handle () = let () = C.global_init C.CURLINIT_GLOBALALL in let handle = new C.handle in let () = beg

我试图在一个脚本中同时启动多个HTTP请求。我正在使用ocurl库(它是libcurl的一个薄包装器),并试图从curl多句柄中读取信息

下面的示例使用了一个简单的curl句柄,效果非常好,可以将响应转储到stdout

module C = Curl ;;

let get_handle () =
    let () = C.global_init C.CURLINIT_GLOBALALL in
    let handle = new C.handle in
    let () = begin
        handle#set_url "google.com";
        handle#set_followlocation true;
    end in
    handle ;;

let main () =
    let obj = get_handle () in
    obj#perform ;;

main () ;;
为了更好地理解API,我尝试使用一个只包含一个请求的简单多执行句柄来做同样的事情。我正在尝试使用
set\u writefunction
方法(这是一个简单的包装器)将单个请求的输出写入包含字符串引用的模块范围变量。我使用的闭包将字符串分配给
message
,然后返回写入的字节数。我希望看到我在消息中获取的整个文档、它的尾随片段(如果curl使用内容块多次在内部调用我的回调),或者一个空字符串(如果curl使用空字符串标记内容的结尾,我的回调应该处理这种情况)。而是打印
通用初始值
,这表明从未调用回调。为什么没有调用我的回调

module C = Curl ;;
module M = Curl.Multi ;;

let message = ref "generic initial value" ;;

let get_handle () =
    let () = C.global_init C.CURLINIT_GLOBALALL in
    let handle = new C.handle in
    let () = begin
        handle#set_url "google.com";
        handle#set_followlocation true;
        handle#set_writefunction (fun str -> (message := str; String.length (!message)));
    end in
    handle ;;

let batch () =
    let newhandle = get_handle () in
    let multi = M.create () in
    let () = M.add multi newhandle#handle in
    let _ = M.perform multi in
    Printf.printf "%s\n" (!message) ;;

let main () = batch () ;;

main () ;;