<div dir="ltr"><div>Hi all,</div><div><br></div><div>So, almost 2 months after the initial announcement and quite a lot of dogfooding, varnish-rs has seen a few releases and grown a bit. Even though I still consider it in the alpha stage, I wanted to present a couple of vmods I built on top of it.</div><div><br></div><div>The first vmod is the smallest one: vmod_rers (<a href="https://github.com/gquintard/vmod_rers">https://github.com/gquintard/vmod_rers</a>) that deals with Regular Expressions in RuSt.</div><div>A cursory look at the VCC file (<a href="https://github.com/gquintard/vmod_rers/blob/main/vmod.vcc">https://github.com/gquintard/vmod_rers/blob/main/vmod.vcc</a>) will quickly reveal that it does way less than `<a href="https://code.uplex.de/uplex-varnish/libvmod-re2/`">https://code.uplex.de/uplex-varnish/libvmod-re2/`</a> however, there's still a couple of nice things about it:</div><div>- regex are cached in a LRU store, so you don't have to recompile the same dynamic expression over and over again</div><div>- named patterns!</div><div>- there is both a VDP and a VFP, in other words: you can modify content as it enters the cache AND as it leaves it. Note however that to do this, we do cache the whole body, use this feature responsibly.</div><div><br></div><div>The second one is beefier: vmod_reqwest (<a href="https://github.com/gquintard/vmod_reqwest">https://github.com/gquintard/vmod_reqwest</a>) is a vmod_curl on steroids.</div><div>The initial idea here is also to allow the VCL to send and receive HTTP requests, but things got a bit out of hand, and in the end, it has a few extra features:</div><div>- handle multiple requests at the same time, within the same task<br></div><div>- fire-and-forget, non-blocking mode: you can send 15 requests at the same time and continue regular VCL processing as they are in flight</div><div>- proper VCL backend, instead of the regular static backends, you can use dynamic ones backed by reqwest, offering:</div><div>  - redirect following, if the response sports a 30X status, the vmod can automatically follow it</div><div>  - connection pooling, of course</div><div>  - HTTPS backends</div><div>  - proxies for both HTTP and HTTPS</div><div>  - automatic brotli (and gzip and deflate) decompression</div><div>There are a few things missing at the moment, notably probes, but they are coming.<br></div><div><br></div><div>So, things look pretty exciting BUT I haven't tested that in production, and I've mostly been operating in a vacuum so far, so I would love some feedback on APIs, performance, bugs, etc.<br></div><div><br></div><div><div><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div>-- <br></div><div>Guillaume Quintard<br></div></div></div></div><br><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">---------- Forwarded message ---------<br>From: <b class="gmail_sendername" dir="auto">Guillaume Quintard</b> <span dir="auto"><<a href="mailto:guillaume.quintard@gmail.com">guillaume.quintard@gmail.com</a>></span><br>Date: Sun, Dec 5, 2021 at 5:32 PM<br>Subject: Writing vmods in Rust<br>To: <a href="mailto:varnish-misc@varnish-cache.org">varnish-misc@varnish-cache.org</a> <<a href="mailto:varnish-misc@varnish-cache.org">varnish-misc@varnish-cache.org</a>><br></div><br><br><div dir="ltr"><div>Hi everyone,</div><div><br></div><div>I've been working for a while on a little project that ended up taking quite a chunk of my time, and while it's nowhere near done, I feel like it's time to show the current progress. <b>In other words: that stuff ain't ready, don't put it in prod.</b></div><div><br></div><div>Here we go: we can <b>build vmods using pure rust</b>.</div><div>For example, this guys: <a href="https://github.com/gquintard/varnish-rs/tree/main/examples" target="_blank">https://github.com/gquintard/varnish-rs/tree/main/examples</a></div><div>And the crates `varnish` and `varnish-sys`, that make this possible have been published on <a href="http://crates.io" target="_blank">crates.io</a>, and we have documentation! <a href="https://docs.rs/varnish/latest/varnish/" target="_blank">https://docs.rs/varnish/latest/varnish/</a></div><div><br></div><div>Without trying to start a language war, there are a few benefits to using Rust over C:</div><div>- the language is designed to prevent a few classes of annoying bugs, and the compiler is very good at explaining where you went wrong</div><div>- a lot of the C practices (assert everywhere, miniobj, etc.) are basically baked into Rust</div><div>- the barrier between C and Rust is razor-thin, with almost zero overhead cost (curse you, null-terminated strings!)</div><div>- the tooling is absolutely stellar</div><div>- string manipulation is sane (yeah, easy stab at C, but I had to do it)</div><div><br></div><div>What you get at the moment:</div><div>- few dependencies: you only need cargo, python3 and the libvarnish dev files to get going<br></div><div>- write the same vmod.vcc as you would for C, the boilerplate is generated for you</div><div>- building is literally just one command: `cargo build`</div><div>- automatic type translation so you can write pure rust, and never need to see the `VCL` objects under their C form (<a href="https://docs.rs/varnish/latest/varnish/vcl/convert/index.html" target="_blank">https://docs.rs/varnish/latest/varnish/vcl/convert/index.html</a>)<br></div><div>- support for PRIVobjects (<a href="https://github.com/gquintard/varnish-rs/blob/main/examples/vmod_object/vmod.vcc" target="_blank">https://github.com/gquintard/varnish-rs/blob/main/examples/vmod_object/vmod.vcc</a> and <a href="https://github.com/gquintard/varnish-rs/blob/main/examples/vmod_object/src/lib.rs" target="_blank">https://github.com/gquintard/varnish-rs/blob/main/examples/vmod_object/src/lib.rs</a>)<br></div><div>- you can iterate through and modify the HTTP objects easily (<a href="https://docs.rs/varnish/latest/varnish/vcl/ctx/struct.Ctx.html" target="_blank">https://docs.rs/varnish/latest/varnish/vcl/ctx/struct.Ctx.html</a>)</div><div><br></div><div>What you don't get for now:</div><div>- a comprehensive API, some bits are still missing, like WS_ReserveAll/WS_Release, but because of the type conversion, you can possibly live without it</div><div>- a stable API. I'm heavily working on it, and things will change twenty times before the next Varnish release (but it doesn't matter as the crates are version-locked)</div><div>- something based solely on the public library (libvarnishapi), I reimplemented some stuff using private bits to avoid copies</div><div>- all the types. I only implemented a subset of VCL types, but fret not, the others will come.</div><div>- a sensible boilerplate code generation, the current approach involves embedding a python script that imports `vmodtool.py` and running it from rust. But there's a plan to fix that</div><div><br></div><div>In case you want to try it, I've also created a minimal example repo that you can play with:</div><div style="margin-left:40px"><span style="font-family:monospace">git clone <a href="https://github.com/gquintard/vmod-rs-template.git" target="_blank">https://github.com/gquintard/vmod-rs-template.git</a></span></div><div style="margin-left:40px"><span style="font-family:monospace">cd vmod-rs-template</span></div><div style="margin-left:40px"><span style="font-family:monospace">cargo build</span></div><div style="margin-left:40px"><span style="font-family:monospace">cargo test</span></div><div><br></div><div>I will continue working on expanding the API, documentation and will start filing issues to come up with a roadmap. If you are interested in helping, have questions or feedback, please do ping me, I'd love to hear from you.</div><div><br></div><div>Cheers!</div><div><br></div><div><div dir="ltr" data-smartmail="gmail_signature"><div dir="ltr"><div>-- <br></div><div>Guillaume Quintard<br></div></div></div></div></div>
</div></div></div>