From: Jeroen H. <vex...@gm...> - 2010-02-11 22:00:50
|
Hi, On Thu, Feb 11, 2010 at 17:50, Dean Michael Berris <mik...@gm...> wrote: > On Fri, Feb 12, 2010 at 12:27 AM, Jeroen Habraken <vex...@gm...> wrote: >> Hi guys, >> >> On Thu, Feb 11, 2010 at 15:25, Dean Michael Berris >> <mik...@gm...> wrote: >>> I was thinking about this a little and thought it would be cool to >>> have a collection of utilities of commonly-performed actions that >>> others might find useful in the library. Off the top of my head I find >>> that these would be cool functions/mini-libraries to have: >> >> This would be very nice indeed. Also, in my opinion, we need a few >> more code examples as I've generally found them to be a good way to >> familiarize yourself with a library. Something like a simple HTTP >> proxy might even fall in both categories, showing off both the client >> and server side of the library. >> > > Code examples are definitely good to have. I'm a little afraid though > that we'd ruffle a few feathers if we implemented something like this. > I've been meaning to do a wicked fast static HTTP server that competes > with lighttpd/nginx in simplicity and performance. My worry would be > that it would be a project that would have its own demons. ;) > >> >> The query parser is indeed one of the things currently on the TODO >> list for the URI part of the library. Design-wise I was thinking of >> something like: >> >> template <class Tag> >> bool parse_query(basic_uri<Tag> const & uri, typename query_list<Tag>::type &) { >> // TODO Parse using Spirit >> >> return true; // Return whether it was successful. >> } >> >> with >> >> template <class Tag> >> struct query_list { >> typedef typename string<Tag>::type string_type; >> >> typedef typename std::list<std::pair<string_type, string_type> > type; >> } >> >> and something along the same lines for query_map for a std::map. This >> is off the top of my head, and your thoughts would be very much >> appreciated. As I've said before, most of the grunt work has already >> been done by Hartmunt in this brilliant article: >> http://boost-spirit.com/home/articles/qi-example/parsing-a-list-of-key-value-pairs-using-spirit-qi/ >> thus with some luck this is actually rather easy. >> > > Sure, but it just assumes the "canonical" form of "key=value&foo=bar". > There's a lot more to query strings than just this form (some use > different delimeters, instead of &, some use |, there's also list and > multi-form notation like "form1[field]=value&form2[field]=value" and > all sorts of funky things). That in itself sounds like a pretty > useful/powerful set of parsers that would definitely make for an > interesting project. I know, and worse, as far as I know there is no official specification on how this is done. At least, it's not in any RFC that I know, and I couldn't find anything from W3C either. If I'm wrong, and might well be, a link to the specs would be very much appreciated. > Now I'm seriously considering applying for a Google Summer of Code > thing to get support for the project. :D Maybe after BoostCon and once > more people get to use the library more. ;) +1 >> Secondly, I have the basis of a dispatcher I wrote for libevent >> bindings some time ago, which I've attached. There seem to be a few >> things which need to be abstracted from though: >> - The comparison function >> - The type you're comparing to >> and quite probably a few more things, as ultimately I'd be very useful >> if you could stick in boost::starts_with, something from the regex >> library or from the xpressive library to find a match. If anyone finds >> this code is of any use for cpp-netlib, I'll stick a boost license on >> it. >> > > I haven't looked at it yet, but I have a somewhat dormant header-only > library on SourceForge that does pretty much something similar (It's > called the Runtime Dynamic Dispatch Library). I'm looking for > something more flexible though, something that allows me to map a > boost::regex string that contains sub-groups (or named groups) to a > function that has the signature: void(request const &, response &). > > Does your implementation do roughly that? > > I might come up with a simple implementation and place it in > boost/network/utils -- when I get time to do so that is. ;) No, my code is trivial in every way (it was written before I learned most techniques on writing generic code, and it was written specifically for one application), but it might offer a starting point. >>> Any takers? It would be cool if we had these in the library before May >>> where I will be presenting the library and the techniques used in the >>> library at a high level. ;) >> >> This is where things get tricky, considering I've just got an >> apartment this month and will be moving, I'm quite limited when it >> comes to free time unfortunately. >> > > I can understand that completely, having been in that situation > before. May is still a ways away -- you've got time in between now and > then. :D Yeah, it's just that I can't plan anything. I've been thinking about what I'd like to add to 0.7 etcetera, but this is kind of hard not knowing how much time I can spend on it. >>> Hope this helps and I hope to hear from you guys soon too! >>> >> >> Hope this is of any use, > > I'll take a look and I encourage others in the list to do the same. :) > > -- > Dean Michael Berris > cplusplus-soup.com | twitter.com/deanberris > linkedin.com/in/mikhailberis | facebook.com/dean.berris | deanberris.com > Jeroen |