dlang-requests 1.1.0 released
ikod
geller.garry at gmail.com
Sun Apr 5 12:52:08 UTC 2020
On Sunday, 5 April 2020 at 11:53:29 UTC, Petar Kirov [ZombineDev]
wrote:
> 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.
Internally my code do not modify these data, but I understand
your concern.
>
> 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
Thanks! You are totally right regarding casting mutable to
immutable. Base code was written when I did not understand this
problem well enough. I know how to fix this but this probably
require large enough rewrite. I hope I'll do this in some near
future.
PS. I also have package which convert nogc unique mutable byte
array to immutable byte array and attach this immutable data "as
is" to buffer (which is essentally array of immutable(ubyte)[]).
Then every operation on buffer (trim, split, search, etc)
performed on immutable with zero copy and with warranties on data
immutability.
More information about the Digitalmars-d-announce
mailing list