dlang-requests 1.1.0 released

Petar Petar
Sun Apr 5 11:53:29 UTC 2020


On Sunday, 5 April 2020 at 08:59:50 UTC, ikod wrote:
> Hello!
>
> Just a note that dlang-requests ver 1.1.0 released with new 
> 'ByLine' interfaces added for get/post/put requests.
>
> range algorithms can be applied to server responses, so that 
> simple chain
>
> getContentByLine("https://httpbin.org/anything")
>     .map!"cast(string)a"
>     .filter!(a => a.canFind("data"))
>
> should work.
>
> These calls work lazily so you can apply them to large 
> documents.
>
> dlang-requests - HTTP client library, inspired by 
> python-requests with goals:
>
> small memory footprint
> performance
> simple, high level API
> native D implementation
>
> https://github.com/ikod/dlang-requests
> https://code.dlang.org/packages/requests
>
> Always waiting for your bugreports and proposals on project 
> page.
>
> Best regards!

Nice work!

One quick suggestion: avoid direct casting from `ubyte[]` to 
`string`:

/+dub.sdl:
dependency "requests" version="~>1.1"
+/

void main()
{
     import requests : getContentByLine;
     import std : assumeUTF, canFind, each, filter, map, write;

     getContentByLine("https://httpbin.org/anything")
         .map!assumeUTF // instead of map!"cast(string)a"
         .filter!(a => a.canFind("data"))
         .each!write;
}

1. From a code-style point of view, assumeUTF is better as it 
shows the intention to the reader - assume that the content is 
valid UTF8 encoded text, without performing validation. And if 
there are UTF8 errors, it is easy to go back and add validation 
there.
2. Avoid casting mutable data to immutable. The data path in your 
library is rather complex (getContentByLine -> _LineReader -> 
LineSplitter -> Buffer -> ...) and so it was hard to understand 
from a quick glance whether or not the buffer array is reused 
(but I would guess that it is). If the buffer array is reused, it 
means that the result of calling _LineReader.front() may be 
modified at a later point in time, which I think is obvious that 
it can lead to some rather nasty bugs in users' code.

I suggest you look into Steven's iopipe[1] library, as I believe 
it can help you clean up and refactor this part of the codebase 
(and can probably yield some performance improvements along the 
way).

[1]: https://github.com/schveiguy/iopipe


More information about the Digitalmars-d-announce mailing list