On Tuesday, 19 June 2018 at 08:56:05 UTC, Russel Winder wrote:
I believe we have a first, Code Critique 112 is a D code. And
indeed a vibe.d one. I believe a number of people from this
email list should volunteer themselves to do a constructive
critique to help educate ACCU members. With the obvious subtext
of D being a far, far better language than C++ ;-)
I'm not quite sure constructive critique is possible in this
case. It's just a bad piece of code poorly implementing something
that is a part of the vibe-core.
Below is the email from accu-general
-------------------------------------------------------------------
Code Critique 112
Hello all,
Below is the code for Code Critique number 112
As usual, please don't reply to the list with your entry but
email s...@accu.org for collation.
------------------------------------------------------------------------
(Submissions to s...@accu.org by August 1st)
Further to articles introducing D, I am attempting to use the
event-driven Vibe.d server library, which I understand to be
like a native version of Python's Tornado and potentially a
“killer app” of D as I haven't seen any other mature
event-driven server library in a compiled language.
I would like to build a back-end server that performs some
processing on the body of the HTTP request it receives. To
begin with, I would like it to simply echo the request body
back to the client.
There is vibe.web.rest which covers 90% of everything one might
need for their back-end application. There's practically no
reason to bother with bodyReaders/Writers.
My code works but there are three problems: (1) when I issue a
POST request with lynx, 3 spaces are added to the start of the
response text, (2) I cannot test with nc because it just says
404 and doesn't log anything, and (3) I'm worried that reading
and writing just one byte at a time is inefficient, but I can't
see how else to do it: I raised a "more documentation needed"
bug at https://github.com/vibe-d/vibe.d/issues/2139 but at the
time of writing nobody has replied (should I have used a
different forum?)
--- code ---
import vibe.d;
void main() {
auto settings = new HTTPServerSettings;
settings.port = 8080;
listenHTTP(settings, (req, res) {
ubyte[1] s;
while(!req.bodyReader.empty()) {
req.bodyReader.read(s);
res.bodyWriter.write(s);
}
});
runApplication();
}
1. It has something to do with lynx, curl works flawlessly
2. Writing HTTP manually is somewhat painful. Request should look
something like this:
$ echo -ne "POST / HTTP/1.1\r\nHost:
localhost:8080\r\nContent-Length: 3\r\n\r\nHey" | nc localhost
8080
3. There's `pipe` function in `vibe.core.stream` which does
exactly that. I haven't looked at its code but I'm pretty sure
it's far more efficient than byte-by-byte approach:
```
import vibe.d;
void main() {
auto settings = new HTTPServerSettings;
settings.port = 8080;
listenHTTP(settings, (req, res) {
req.bodyReader.pipe(res.bodyWriter);
});
runApplication();
}
```