On Tue, Jun 24, 2008 at 3:57 PM, Leonardo Foderaro <[EMAIL PROTECTED]>
wrote:

> 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.


I suppose this depends on the overall model. You'll want to support
simultaneous processing of multiple gadgets, right? If so, then you'll want
to be able to do this:

- add all gadgets to curl and start processing
- when a gadget is returned (not all files will come back at the same speed
due to remote host differences and the like -- some may even be cached if
you support that), you'll want to parse it and extract the referenced urls
- add the referenced urls to curl and continue processing.

* keep processing until nothing remains in the queue, then render.


>
>
> 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