[HN Gopher] Show HN: Hurl - Run and test HTTP requests with plai...
       ___________________________________________________________________
        
       Show HN: Hurl - Run and test HTTP requests with plain text, curl
       and Rust
        
       Author : jicea
       Score  : 178 points
       Date   : 2021-10-05 12:02 UTC (10 hours ago)
        
 (HTM) web link (hurl.dev)
 (TXT) w3m dump (hurl.dev)
        
       | osener wrote:
       | Reminds me of https://github.com/pashky/restclient.el. Nice to
       | see an editor-agnostic version of this idea, great job!
        
         | brabel wrote:
         | Also similar to the Jetbrains HTTP textual client:
         | https://www.jetbrains.com/help/idea/http-client-in-product-c...
         | 
         | It uses JS to perform assertions though.
        
         | jedimind wrote:
         | I suggested that same, then I saw your comment, so I deleted my
         | comment and upvoted yours instead. Happy to see these gems
         | becoming more popular.
        
       | gt5050 wrote:
       | https://curl.link/
       | 
       | Shameless plug, built this small tool to share curls.
        
       | [deleted]
        
       | LeonaWilson wrote:
       | Let's Secure WiFi Network and Prevent WiFi Hacking-
       | https://www.hackerslist.co/lets-secure-wifi-network-and-prev...
        
       | gizdan wrote:
       | There's also dot-http[0] which aims to provide a similar
       | interface to what IntelliJ's requests feature has. I've used it a
       | few times. It's a shame development has died, so hopefully Hurl
       | can take its place.
       | 
       | [0] https://github.com/bayne/dot-http
        
         | tikkabhuna wrote:
         | When I saw this I was thinking of IntelliJ's HTTP client[1]. I
         | hope that a standardised format can come out of this.
         | 
         | [1] https://www.jetbrains.com/help/idea/http-client-in-
         | product-c...
        
           | jicea wrote:
           | Yes, we began to work on Hurl three years ago and the file
           | format was "accidentaly" close to IntelliJ's HTTP file
           | format. For the request part, it's not a coincidence since
           | Hurl and IntelliJ's HTTP looks like "bare" HTTP format. They
           | differ drastically on the response tests.
           | 
           | 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");       });       %}
        
             | tikkabhuna wrote:
             | > 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.
             | 
             | 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.
        
               | brabel wrote:
               | The Jetbrains format can also be run from the CLI or CI:
               | https://renatoathaydes.github.io/rawhttp/rawhttp-
               | modules/req...
        
       | phenkdo wrote:
       | thanks! this looks like something i could use.
       | 
       | p.s. coolest and most intuitive name btw.
        
         | ReactiveJelly wrote:
         | I'm actually curious about the name.
         | 
         | OP says "an Hurl request" above. So it's pronounced with a
         | silent "H"? Like "An hour of time?"
        
           | phenkdo wrote:
           | i'd pronounce it the same way i read it, hurl something.
        
         | evanelias wrote:
         | Does no one remember hurl.it? It's a web-based http request
         | tool that has already been using the name Hurl since 2009:
         | https://www.hurlit.com/about/ ... originally co-created by one
         | of GitHub's founders no less.
        
       | Kinrany wrote:
       | Tangentially related: does anyone do Pact-like consumer-driven
       | testing?
       | 
       | Are there good articles about testing services in Rust?
        
       | benatkin wrote:
       | At first I thought it was this: https://www.hurlit.com/about/
        
       | [deleted]
        
       | leetrout wrote:
       | The Hurl web app was great and has saved me a ton of time in the
       | past.
       | 
       | Recently I've replaced Hurl and Postman with the REST Client
       | extension for VS Code.
       | 
       | https://marketplace.visualstudio.com/items?itemName=humao.re...
        
         | benatkin wrote:
         | It's still there: https://www.hurlit.com/about/
         | 
         | Recently acquired in fact.
        
           | ceejayoz wrote:
           | Interesting; is that someone rehosting the original app?
           | 
           | https://hurl.it/ got bought at some point.
        
             | benatkin wrote:
             | It was relaunched 5 months ago, and if you go on WayBack
             | Machine, it seems it hasn't changed at all, except perhaps
             | to add a Captcha.
             | 
             | I think they probably plan to do more with it, and thus
             | there's a name conflict for hurl.dev.
        
         | certifiedloud wrote:
         | A lot of people use tools like hurl for integration and smoke
         | tests during CI runs. The extension looks nice, but it is
         | limited in that way.
        
           | leetrout wrote:
           | So what we really need is a nice VS Code extension for Hurl.
        
       | taf2 wrote:
       | Ah reminds of hurl.it - loved that service...
        
       | jicea wrote:
       | We're releasing a new version of Hurl, a simple HTTP cli tool
       | built on top of libcurl and Rust.
       | 
       | 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
        
         | maverwa wrote:
         | Looks like something we could actually use for some API smoke
         | tests. I'll bookmark it, thank you!
        
         | woile wrote:
         | This looks really cool! Very promising!
         | 
         | 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
        
           | fabricereix wrote:
           | Yes, this is possible to chain a value from a response to the
           | next request. The value is extracted and stored in a
           | variable. This variable can be reused afterward.
           | # 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 302
        
         | certifiedloud wrote:
         | The first feature I look for in tools like this is the ability
         | to run requests concurrently. Of course some requests depend on
         | others, but there are often a lot of requests that can be run
         | concurrently to save time. I don't see how to do that with
         | hurl.
        
           | fabricereix wrote:
           | This is not possible yet.
           | 
           | We 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.
        
             | nonameiguess wrote:
             | Can you read a request from stdin? It could just be catted
             | through GNU parallel to launch many hurls concurrently.
        
       | ironmagma wrote:
       | This is looking like what Postman should have been.
        
         | ceejayoz wrote:
         | Postman used to be nice and simple like this, and there used to
         | be hurl.it as a web interface for making HTTP requests. I used
         | that a lot. I'm guessing it got abused, though.
        
       | sandes wrote:
       | Keep up the good work :)
        
       | enriquto wrote:
       | This is seriously cool, and I would use it frequently... if only
       | there was a rust compiler in my computer.
       | 
       | 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).
        
         | ironmagma wrote:
         | Is a Rust compiler really needed? They say there are
         | precompiled binaries available and the package is on several
         | package managers.
        
         | nicoburns wrote:
         | Others have already commented that you don't need a rust
         | compiler for this. But it's also worth noting that compiling
         | Rust programs is typically much more straightforward than
         | compiling C programs, even if you account for installing the
         | Rust compiler as part of the process.
         | 
         | 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.
        
           | enriquto wrote:
           | 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.
        
             | nicoburns wrote:
             | Ah, OpenBSD looks like a bit of an exception in terms of
             | platform support. FreeBSD and NetBSD both have Tier 2
             | (which is really the minimum level you want for a compiler
             | host platform), but not OpenBSD.
        
         | elsombrero wrote:
         | In the installation page they just say to download the prebuilt
         | binaries for your system, no need to compile it your self
        
         | ReactiveJelly wrote:
         | https://hurl.dev/docs/installation.html
         | 
         | > 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."
        
           | jicea wrote:
           | As a matter of fact, our first implementation of Hurl was
           | written in Python. We switch to Rust because:
           | 
           | - 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)
        
             | Fiahil wrote:
             | Good choice, Rust is much better than python for
             | concurrency, and that might be of interest in a future
             | release :)
        
           | lpcvoid wrote:
           | >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.
        
             | DandyDev wrote:
             | I don't think the claim is that Python is a good
             | replacement for C. But there are probably more (business)
             | problems for which Python is the right tool to solve it
             | then problems for which C is the right tool.
             | 
             | 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.
        
             | nicoburns wrote:
             | I think the success of Go and Rust show that lots of people
             | care about performance. But it has to come second to
             | correctness and safety/security, and C makes achieving
             | those things very difficult compared to other languages.
        
         | fabricereix wrote:
         | You don't need a Rust compiler as prebuilt binaries are
         | available for your system.
         | https://hurl.dev/docs/installation.html
         | 
         | 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.
        
       ___________________________________________________________________
       (page generated 2021-10-05 23:01 UTC)