puzza007 / katipo Goto Github PK
View Code? Open in Web Editor NEWHTTP2 client for Erlang based on libcurl and libevent
License: Other
HTTP2 client for Erlang based on libcurl and libevent
License: Other
===> Running coveralls...
===> Uncaught error in rebar_core. Run with DEBUG=1 to see stacktrace
===> When submitting a bug report, please include the output of `rebar3 report "your command"`
make: *** [coveralls] Error 1
The command "PATH=.:$PATH make update test dialyzer coveralls" exited with 2.
cache.2
store build cache
Repro: run this a few times and the port process should crash
katipo:req(test,
#{body => ["i", "am", [], <<"an">>, "iolisttttttttttttttttttttttttttttttttttttttttttt thats really long"],
url => <<"http://127.0.0.1:1080/">>}).
Hello,
Right now the API provides only methods that blocks the current process until the response is received. Can you add API's that sends the response when is ready to a specified PID ?
Silviu
Like remiq/gproc@f2490cb
Hey, I notice its locked at 2.4.0 but it makes it difficult to use this lib with {:plug_cowboy, "~> 2.0"}
Hi @puzza007
I'm trying to send a GET
request without HTTP2
.
Even if I specify {pipelining, nothing}
, this query seems to be sent using HTTP2.
{ok, _} = application:ensure_all_started(katipo).
Pool = api_server.
{ok, _} = katipo_pool:start(Pool, 2, [{pipelining, nothing}]).
ReqHeaders = [{<<"User-Agent">>, <<"katipo">>}].
Req = #{url => <<"https://www.vancleefarpels.com/">>,
method => get,
headers => ReqHeaders,
connecttimeout_ms => 5000,
ssl_verifyhost => false,
ssl_verifypeer => false}.
{ok, #{status := 200,
headers := RespHeaders,
cookiejar := CookieJar,
body := RespBody}} = katipo:req(Pool, Req).
** exception error: no match of right hand side value
{error,#{code => unknown_error,
message => <<"HTTP/2 stream 1 was not closed cleanly: INTERNAL_ERROR (err 2)">>}}
Is there a way to tell katipo
to not use HTTP/2
?
Many thanks
To use katipo one needs to start erl with some dirty scheduler related switch? If so, it would be helpful to add this to README.md
is there any chance to add CURLOPT_INTERFACE option?
Hi @puzza007 ,
I'm getting an error when trying to fetch a webpage via a GET request, and using a proxy:
> {ok, _} = application:ensure_all_started(katipo).
> {ok, _} = katipo_pool:start(pool, 1, [ {pipelining, nothing} ]),
> katipo:get(pool, "https://www.google.com/", #{proxy => "http://localhost:3128",
ssl_verifyhost => false,
ssl_verifypeer => false,
connecttimeout_ms => 5000}).
{error,#{code => bad_opts,
message =>
<<"[{url,\"https://www.google.com/\"},{proxy,\"http://localhost:3128\"}]">>}}
My proxy is working perfectly, and I'm able to test it using cURL.
$ curl -x "http://localhost:3128" "https://www.google.com/" > google.html
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 19649 0 19649 0 0 214k 0 --:--:-- --:--:-- --:--:-- 215k
$ ls -la google.html
.rw-r--r-- 20k zab 11 Sep 01:22 google.html
It fails with a wrong/closed port 9999
, which proves my proxy is working as expected:
$ curl -x "http://localhost:9999" "https://www.google.com/"
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
curl: (7) Failed to connect to localhost port 9999 after 0 ms: Couldn't connect to server
What am i missing?
My setup:
. Erlang: 26.0.2
| 25.3.2.4
| 24.2.1
. katipo from master
. macOS: Ventura 13.5.1
Help appreciated
Z.
In the first example sslverifyhost and sslverifypeer keys should be ssl_verifyhost and ssl_verifypeer
From a short research I just did, capath
(or in libcurl's terms, CURLOPT_CAPATH
) will be rarely the thing that the library user actually wants. The usual use case of using such option is in case of a self-signed certificate.
The problem is, CURLOPT_CAPATH
is expected to be a directory containing CA certificate files along with their hashes. Typically, the user will want to provide just a single CA certificate file. I suggest adding another option, cacert
, which will translate to CURLOPT_CAINFO
, which is an option that supports just that scenario.
I can prepare a PR for that if that addition will get settled.
Are there any plans to update this project to make it compatible with Erlang 20.0? Right now, it fails to build on my machine, and it seems due to changes introduced in Erlang versions more recent than 19.3. I played around with travis-ci, it builds fine with 19.3, but shows errors for 20.0: https://travis-ci.org/nroi/katipo
I have the following compilation error :
===> Rebar3 detected a lock file from a newer version. It will be loaded in compatibility mode, but important information may be missing or lost. It is recommended to upgrade Rebar3.
===> Compiling katipo
make: Entering directory '/home/pascal/boruta/boruta_umbrella/deps/katipo/c_src'
cc /home/pascal/boruta/boruta_umbrella/deps/katipo/c_src/katipo.o -L /usr/lib/erlang/lib/erl_interface-4.0.1/lib -lerl_interface -lei -lcurl -lssl -lcrypto -levent -o /home/pascal/boruta/boruta_umbrella/deps/katipo/c_src/../priv/katipo
/usr/bin/ld: cannot find -lerl_interface
collect2: error: ld returned 1 exit status
make: *** [Makefile:52: /home/pascal/boruta/boruta_umbrella/deps/katipo/c_src/../priv/katipo] Error 1
make: Leaving directory '/home/pascal/boruta/boruta_umbrella/deps/katipo/c_src'
===> Hook for compile failed!
** (Mix) Could not compile dependency :katipo, "/home/pascal/.mix/rebar3 bare compile --paths /home/pascal/boruta/boruta_umbrella/_build/test/lib/*/ebin" command failed. You can recompile this dependency with "mix deps.compile katipo", update it with "mix deps.update katipo" or clean it with "mix deps.clean katipo"
As I don't know much about Erlang, I don't even know where to start.
any clues ?
Pending inaka/worker_pool#111
Last example in README.md should have ssl_verifyhost and ssl_verifypeer.
Hi,
I'm having an issue when compiling katipo
on MacOS Ventura 13.5 M1 as you can see in the logs below:
$ rebar3 compile
===> Verifying dependencies...
===> Fetching katipo v1.0.4
===> Fetching rebar3_hex v7.0.7
===> Fetching hex_core v0.8.4
===> Fetching verl v1.1.1
===> Analyzing applications...
===> Compiling verl
===> Compiling hex_core
===> Compiling rebar3_hex
===> Fetching rebar3_proper v0.12.1
===> Analyzing applications...
===> Compiling rebar3_proper
===> Fetching coveralls v1.4.0
===> Analyzing applications...
===> Compiling coveralls
===> Fetching metrics v2.5.0
===> Fetching worker_pool v6.0.0
cc -O3 -std=c99 -arch x86_64 -Wall -Wmissing-prototypes -fPIC -I /Users/giorgio.torres/.asdf/installs/erlang/24.3.4.13/erts-12.3.2.13/include/ -I /Users/giorgio.torres/.asdf/installs/erlang/24.3.4.13/lib/erl_interface-5.2.2/include -c -o /Users/giorgio.torres/projects/test_katipo/_build/default/lib/katipo/c_src/katipo.o /Users/giorgio.torres/projects/test_katipo/_build/default/lib/katipo/c_src/katipo.c
/Users/giorgio.torres/projects/test_katipo/_build/default/lib/katipo/c_src/katipo.c:2:10: fatal error: 'event.h' file not found
#include <event.h>
^~~~~~~~~
1 error generated.
make: *** [/Users/giorgio.torres/projects/test_katipo/_build/default/lib/katipo/c_src/katipo.o] Error 1
===> Hook for compile failed!
rebar3 compile
I found this answer on StackExchange that helped pass through the fatal error: 'event.h' file not found
.
But then I get the following error:
$ export LDFLAGS="-L/opt/homebrew/lib"
$ export CPPFLAGS="-I/opt/homebrew/include"
$
$ rebar3 compile
===> Verifying dependencies...
cc -O3 -std=c99 -arch x86_64 -Wall -Wmissing-prototypes -fPIC -I /Users/giorgio.torres/.asdf/installs/erlang/24.3.4.13/erts-12.3.2.13/include/ -I /Users/giorgio.torres/.asdf/installs/erlang/24.3.4.13/lib/erl_interface-5.2.2/include -I/opt/homebrew/include -c -o /Users/giorgio.torres/projects/test_katipo/_build/default/lib/katipo/c_src/katipo.o /Users/giorgio.torres/projects/test_katipo/_build/default/lib/katipo/c_src/katipo.c
cc /Users/giorgio.torres/projects/test_katipo/_build/default/lib/katipo/c_src/katipo.o -L/opt/homebrew/lib -L /Users/giorgio.torres/.asdf/installs/erlang/24.3.4.13/lib/erl_interface-5.2.2/lib -lei -lcurl -lssl -lcrypto -levent -o /Users/giorgio.torres/projects/test_katipo/_build/default/lib/katipo/c_src/../priv/katipo
ld: warning: ignoring file /Users/giorgio.torres/projects/test_katipo/_build/default/lib/katipo/c_src/katipo.o, building for macOS-arm64 but attempting to link with file built for unknown-x86_64
Undefined symbols for architecture arm64:
"_main", referenced from:
implicit entry/start for main executable
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [/Users/giorgio.torres/projects/test_katipo/_build/default/lib/katipo/c_src/../priv/katipo] Error 1
===> Hook for compile failed!
which I solved by running the same command shown just after the ===> Verifying dependencies...
but with the flag -arch arm64
:
cc -O3 -std=c99 -arch arm64 -Wall -Wmissing-prototypes -fPIC -I /Users/giorgio.torres/.asdf/installs/erlang/24.3.4.13/erts-12.3.2.13/include/ -I /Users/giorgio.torres/.asdf/installs/erlang/24.3.4.13/lib/erl_interface-5.2.2/include -I/opt/homebrew/include -c -o /Users/giorgio.torres/projects/test_katipo/_build/default/lib/katipo/c_src/katipo.o /Users/giorgio.torres/projects/test_katipo/_build/default/lib/katipo/c_src/katipo.c
and only after that I can compile katipo
:
$ rebar3 compile
===> Verifying dependencies...
cc /Users/giorgio.torres/projects/test_katipo/_build/default/lib/katipo/c_src/katipo.o -L/opt/homebrew/lib -L /Users/giorgio.torres/.asdf/installs/erlang/24.3.4.13/lib/erl_interface-5.2.2/lib -lei -lcurl -lssl -lcrypto -levent -o /Users/giorgio.torres/projects/test_katipo/_build/default/lib/katipo/c_src/../priv/katipo
===> Analyzing applications...
===> Compiling worker_pool
===> Compiling metrics
===> Compiling katipo
===> Analyzing applications...
===> Compiling test_katipo
I suspect there's a kind of misconfiguration with my Homebrew so the include and libs for libevent
aren't being found, but also I don't know why when compiling c_src/katipo.c
the architecture is not set correctly:
$ arch
arm64
Is anybody facing a similar issue?
EDIT
$ brew -v
Homebrew 4.1.3
Homebrew/homebrew-core (git revision 7a144369d9e; last commit 2023-07-12)
Homebrew/homebrew-cask (git revision cb0391d439; last commit 2023-07-12)
$ gcc -v
Apple clang version 14.0.3 (clang-1403.0.22.14.1)
Target: arm64-apple-darwin22.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
$ cc -v
Apple clang version 14.0.3 (clang-1403.0.22.14.1)
Target: arm64-apple-darwin22.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
$ rebar3 -v
rebar 3.22.0 on Erlang/OTP 24 Erts 12.3.2.13
Hi,
Is there a way to limit the number of TCP connections opened? It seems that pool size only sets the number of "workers" not connections.
Thanks,
LP
Travis CI is no longer free for open source
Hi,
sorry to ask this kind of question, but I did not find in your readme how to map between curl command and Erlang code, in particular is the support for NTLM authentication? My command is:
curl -H "<Header>" --ntlm --negotiate -u "<UserName>:<Password>" <URL> -XPOST --data-binary <BinaryContent>
How would I translate it into Katipo language?
Thanks a lot!
Can you please describe which problems you found with existing http clients, and why you cannot solve them so you wrote a new solution based on libcurl ?
Waiting on ninenines/ranch#227
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.