Show HN: Hurl – Run and test HTTP requests with plain text, curl and Rust
hurl.dev
hurl.dev
Hurl allows running HTTP requests defined in a plain text format. It can be used to fetch data, or play a scenario (sequence of requests), asserting responses along the way. With its textual format, it is aimed for both devops and developers. With its command-line usage/simple unique binary, it is aimed for both local dev and continuous integration.
An Hurl sample:
GET https//example.org/books
HTTP/1.1 200
[Asserts]
jsonpath "$.validated" == true
jsonpath "$.books" count == 12
jsonpath "$.books[2].name" == "Dune"
Since our first "Show HN" submission [1], we have made the following changes:- full native support on Windows
- improve Hurl file format syntax (with md5, sha1, sha256 asserts for instance)
- add a tutorial on how to use Hurl [2]
- add a simple interactive mode
- a lot of bug fixes!
In our roadmap, we want to have a better support for package manager (brew, apt etc...), better error feedbacks.
We're looking for contributions on improving/correcting our documentation, build an UI client above Hurl, better IDE tooling integration.
And last but not least, we would be happy to have feeback on it!
[1] https://news.ycombinator.com/item?id=25655737
[2] https://hurl.dev/docs/tutorial/your-first-hurl-file.html
Is it possible to chain a value from a response to the next request? This would be useful for testing.
My understand is that between the header and the body there has to be a new line[0], in the docs seems like it's skipped[1], does it affect functionality if skipped? or is it intentional?
Thanks!
[0]: https://www.lifewire.com/hypertext-transfer-protocol-817944 [1]: https://hurl.dev/index.html#also-an-http-test-tool
# Get home:
GET https://example.net
HTTP/1.1 200
[Captures]
csrf_token: xpath "string(//meta[@name='_csrf_token']/@content)"
# Do login!
POST https://example.net/login?user=toto&password=1234
X-CSRF-TOKEN: {{csrf_token}}
HTTP/1.1 302We have related issues: - https://github.com/Orange-OpenSource/hurl/issues/87 - https://github.com/Orange-OpenSource/hurl/issues/88
Running several Hurl files concurrently (and independently) is clear and we will probably add in the next few months.
Running requests concurrently in the same Hurl file will be more complicated. The Hurl language has to describe a clear semantic about it.
$ echo GET http://google.com | hurl
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>Recently I've replaced Hurl and Postman with the REST Client extension for VS Code.
https://marketplace.visualstudio.com/items?itemName=humao.re...
Recently acquired in fact.
https://hurl.it/ got bought at some point.
I think they probably plan to do more with it, and thus there's a name conflict for hurl.dev.
It uses JS to perform assertions though.
[1] https://www.jetbrains.com/help/idea/http-client-in-product-c...
We keep working on Hurl because our main goal is to be able to easily run integration tests on a CI or locally in a terminal, which can be difficult with IntelliJ.
But yes, this shows that is really a need for such a tool.
For reference, IntelliJ format:
GET https://httpbin.org/status/200
> {%
client.test("Request executed successfully", function() {
client.assert(response.status === 200, "Response status is not 200");
});
%}
### Failed test: check response status is 200
GET https://httpbin.org/status/404
> {%
client.test("Request executed successfully", function() {
client.assert(response.status === 200, "Response status is not 200");
});
%}I completely agree with this. Its pushed me away from using IntelliJ's feature. I will always prefer a tool that can be built into a CI pipeline over one that has handy IDE integration.
Do you use it as part of a web dev workflow?
We test both HTML and JSON endpoints and those integration tests are a good safety belt.
Are there good articles about testing services in Rust?
Shameless plug, built this small tool to share curls.
p.s. coolest and most intuitive name btw.
OP says "an Hurl request" above. So it's pronounced with a silent "H"? Like "An hour of time?"
Since it is a somewhat "thin" wrapper around curl, are there deep reasons for it to be written in Rust as opposed to, say, C or posix shell? Was learning Rust one of the main goals of this project? (not that there would be anything wrong with that, just asking).
> Precompiled binary is available at hurl-1.3.1-x86_64-linux.tar.gz
https://github.com/Orange-OpenSource/hurl/releases/download/...
> For Debian / Ubuntu, Hurl can be installed using a binary .deb file provided in each Hurl release.
> hurl-bin package for Arch Linux and derived distros.
> An installer is available at hurl-1.3.1-win64-installer.exe
Just glancing at a few files, main.rs is already over 500 lines, which means shell would be impractical. C is a very difficult language to learn and to use correctly, so in the long-term there will be more Rust (and Go, and Python) programmers than C programmers. I think that is a good reason for projects to choose other languages.
In fact, one might equally ask why it wasn't written in Python - Python is safer than C, far easier, and performance doesn't sound critical for an HTTP debugger meant to be used interactively by a human.
We're probably already far past the point of "There are more competent Python programmers than competent C programmers."
Maybe this is the point where we need to start thinking about where we went wrong? I know that nobody cares about performance anymore, but if anybody is really thinking about Python as a replacement for C then that makes me sad.
C is also a lot harder than Python to learn.
So for these reasons there are more Python programmers than C programmers.
For some subset of problems for which C is a good tool, Rust is a good alternative, arguably with less foot guns. For some other problems that are solved with C, Golang is a good alternative.
So in the end C is losing marketshare because of all these reasons.
- we're a 30 developper team with Linux, Windows and macOs computers. Installing Hurl with Python on Windows boxes was always a challenge and the single drop Rust binary has been a relief for us,
- in a CI, we really want to run tests as fast as possible. The Rust version (the actual one) seems a lot faster that our Python prototype (certainly due to our lack of optimisation in our Python code)
The process would be:
- Run the `curl | bash` command from https://rustup.rs/ to install rust via rustup
- If you have a non-standard shell configuration that rustup can't detect, then add `~/.cargo/bin` to your PATH.
- Clone the git repository containing the program you wish to compile
- Run `cargo build --release` in the source directory.
That's it, and that will work across all major platforms and almost all Rust programs.
rustup: unrecognized OS type: OpenBSD
EDIT: googling around, it seems to be possible to build rust programs for openbsd, but it does not really work "out of the box". May try to install it this weekend.Relating to the choice of Rust, we think that it is the best language for this type of command-line tool. Performant like C/C++, but way safer to develop. And using native existing libs such as libcurl is possible.