Curl support RFC

Lars T. Kyllingstad public at kyllingen.NOSPAMnet
Mon Mar 14 04:20:26 PDT 2011


On Mon, 14 Mar 2011 02:36:07 -0700, Jonathan M Davis wrote:

> On Monday 14 March 2011 02:16:12 Jonas Drewsen wrote:
>> On 13/03/11 23.44, Andrei Alexandrescu wrote:
>> > On 3/11/11 9:20 AM, Jonas Drewsen wrote:
>> >> Hi,
>> >> 
>> >> So I've spent some time trying to wrap libcurl for D. There is a lot
>> >> of things that you can do with libcurl which I did not know so I'm
>> >> starting out small.
>> >> 
>> >> For now I've created all the declarations for the latest public curl
>> >> C api. I have put that in the etc.c.curl module.
>> > 
>> > Great! Could you please create a pull request for that?
>> 
>> Will do as soon as I've figured out howto create a pull request for a
>> single file in a branch. Anyone knows how to do that on github? Or
>> should I just create a pull request including the etc.curl wrapper as
>> well?
> 
> You can't. A pull request is for an entire branch. It pulls _everything_
> from that branch which differs from the one being merged with. git cares
> about commits, not files. And pulling from another repository pulls all
> of the commits which you don't have. So, if you want to do a pull
> request, you create a branch with exactly the commits that you wanted
> merged in on it. No more, no less.
> 
>> >> On top of that I've created a more D like api as seen below. This is
>> >> located in the 'etc.curl' module. What you can see below currently
>> >> works but before proceeding further down this road I would like to
>> >> get your comments on it.
>> >> 
>> >> //
>> >> // Simple HTTP GET with sane defaults // provides the .content,
>> >> .headers and .status //
>> >> writeln( Http.get("http://www.google.com").content );
>> > 
>> > Sweet. As has been discussed, often the content is not text so you
>> > may want to have content return ubyte[] and add a new property such
>> > as "textContent" or "text".
>> 
>> I've already changed it to void[] as done in the std.file module. Is
>> ubyte[] better suited?
> 
> That's debatable. Some would argue one way, some another. Personally,
> I'd argue ubyte[]. I don't like void[] one bit. Others would agree with
> me, and yet others would disagree. I don't think that there's really a
> general agreement on whether void[] or ubyte[] is better when it comes
> to reading binary data like that.

I also think ubyte[] is best, because:

1. It can be used directly.  (You can't get an element from a void[] 
array without casting it to something else first.)

2. There are no assumptions about the type of data contained in the 
array.  (char[] arrays are assumed to be UTF-8 encoded.)

3. ubyte[] arrays are (AFAIK) not scanned by the GC.  (void[] arrays may 
contain pointers and must therefore be scanned.)

I think the rule of thumb should be:  If the array contains raw data of 
unspecified type, but no pointers or references, use ubyte[].  

void[] is very useful for input parameters, however, since all arrays are 
implicitly castable to void[]:

  void writeData(void[] data) { ... }

  writeData("Hello World!");
  writeData([1, 2, 3, 4]);

-Lars


More information about the Digitalmars-d mailing list