I didn't try to integrate with libevent yet, I have to read something
about it first.
but there's a thing I didn't understand.. can't I simply collect all
the urls I need to fetch (for a single gadget) at once  and then pass
them to the curl_multi (without libevent) ?
it could became a bottleneck, right?
however I'll try to adapt to libevent my example.

thanks
leo

On Tue, Jun 24, 2008 at 6:48 PM, Kevin Brown <[EMAIL PROTECTED]> wrote:
> On Tue, Jun 24, 2008 at 8:42 AM, Leonardo Foderaro <[EMAIL PROTECTED]>
> wrote:
>
>> Hi Kevin,
>> I followed your suggest and played with libcurl in multi mode.. it's cool !
>> I tried some examples found in the net.. but I need more flexibility
>> (e.g. an arbitrary number of easy handles)
>> So I wrote a simple wrapper to deal with the async curl calls with
>> ease,  'cmhw' (Curl Multi Handle Wrapper)
>> The idea is to have a component which take care of all the aspects of
>> the multi curling,
>> you just need to create an instance and add the urls you want to
>> fetch, and it just do the job.
>> it's an early beta version, there's a lot of work which should be done
>> (e.g. all the possible error checking,
>> code optimization / safety checks, a better api interface, a better
>> name... ) but it works.
>> could it be useful for the gadget processing library?
>>
>> an example:
>>
>>  /* our main struct. it holds the curl multi handle and the hash of
>> all the needed resources */
>>  cmhw_context_t *ctx = NULL;
>>
>>  /* represents a single remote resource. holds an 'easy' curl handle
>> and a chunk of memory for the fetched content data */
>>  cmhw_item_t *item = NULL;
>>
>>  /* init...  */
>>  ctx = cmhw_init();
>>
>>  /* add some request (with an optional name, just to get them later
>> with ease) */
>>  cmhw_add_url(ctx, "google", "http://www.google.com";);
>>  cmhw_add_url(ctx, "myspace", "http://www.myspace.com";);
>>
>>  /* download them all!  */
>>  cmhw_perform(ctx);
>>
>>  /* make something interesting with our results */
>>  item = cmhw_item_get(ctx, "google");
>>  fprintf(stderr, "content for '%s'(%s):\n%s\n#####\n\n", item->name,
>> item->url, item->chunk->memory);
>>
>>  item = cmhw_item_get(ctx, "myspace");
>>  fprintf(stderr, "content for '%s'(%s):\n%s\n#####\n\n", item->name,
>> item->url, item->chunk->memory);
>>
>>  /* cleanup.. like a nice application... */
>>  cmhw_cleanup(ctx);
>>
>>
>> please let me know what you think about this and how I could improve it.
>
>
> One thing that might be an issue is that gadget specs frequently require
> fetching additional files (message bundles, preloads, etc.) One nice aspect
> of multi mode is that you can always add new requests at any time, so if you
> set up an async dispatching loop (using libevent), you can get very high
> concurrency rates.
>
>
>>
>> thanks
>> leo
>>
>>
>>
>>
>>
>> On Mon, Jun 23, 2008 at 1:42 AM, Kevin Brown <[EMAIL PROTECTED]> wrote:
>> > On Sun, Jun 22, 2008 at 3:16 PM, Leonardo Foderaro <
>> [EMAIL PROTECTED]>
>> > wrote:
>> >
>> >> Hi,
>> >> I'm trying to write a simple prototype of the library we talked about
>> >> some days ago.
>> >> It is a really early version at the moment.. just some experiments (of
>> >> course the lucky codename is test.c )
>> >>
>> >> What I'm using:
>> >> - libcurl  for the remote content fetching
>> >> - libxml2  for the gadget xml parsing
>> >> - some data structures from the glibc2.0 (e.g. GHashTable) for storing
>> >> dynamic variables
>> >> - a lexical scanner (generated using flex) for the hangman substitution
>> >>
>> >> Actually I'm able to fetch a gadget from a remote URL (or a local
>> >> file), load it into the XmlParser and perform the hangman vars
>> >> substitution of the Content node through the flex scanner  (only
>> >> __MODULE_ID__ for now).
>> >>
>> >> Of course there's a lot of work to do.
>> >>
>> >> Let me know what could be the next logical step.. I think I should
>> >> construct a C representation of the gadget with all its properties,
>> >> right? (it just writes to stdout at the moment)
>> >
>> >
>> > Yeah, you'll probably want a struct similar to the JSON output from
>> > /metadata in Shindig. As a library user / module writer, that's what I'd
>> > want to consume.
>> >
>> > Definitely try libcurl in multi mode -- it's quite possible to implement
>> a
>> > high concurrency http client in this model using async events -- you can
>> use
>> > libevent for this.
>> >
>> > The ideal library would probably look something like this:
>> >
>> > os_request *req = os_request_create();
>> > req->locale = ...
>> > os_request_add_gadget(req, "http://example.org/gadget.xml";);
>> > os_get_data(req, &callback);
>> >
>> > void callback(os_request *req, os_response *resp) {...}
>> >
>> > Rendering could then be implemented as a consumer of this library.
>> >
>> >
>> >
>> >>
>> >> thanks to all,
>> >> leonardo
>> >>
>> >
>>
>

Reply via email to