16 июля 2010

Mini HTTP server

Понадобился в приложении мини http сервер и http клиент. С клиентом все просто - можно просто воспользоваться функциями WinInet, написав к ним немного C++-оберток.

Сервер можно довольно просто написать на Boost.Asio, но оказалось все уже изобретено - хорошо подошла cpp-netlib, вот пример кода сервера из документации:
struct hello_world;
typedef http::server server;

struct hello_world {
void operator() (server::request const &request,
server::response &response) {
response = server::response::stock_reply(
server::response::ok, "Hello, World!");
}
void log(...) {
// do nothing
}
};

hello_world handler;
http::server server_("0.0.0.0", "80", handler);
server_.run();

Библиотека, правда, довольно сырая - пришлось немного допиливать напильником чтобы скомпилировалась под VC++10. Но зато в комплекте идут приятные бонусы типа url_decode, которые вполне пригодились.

PS. Забавно было когда сделал и запустил простейший сервер - FireFox грузил http://localhost/ очень долго, дольше чем http://www.yandex.ru/. Я уж было стал грешить на cpp-netlib и boost.asio, но оказалось IE открывал localhost мгновенно. Как я понял, FF долго ресолвит адрес localhost (причем каждый раз видимо заново), а http://127.0.0.1/ открывает мгновенно.

3 комментария:

GooRoo комментирует...

Ещё есть библиотечка Wt из, скажем так, смежной области применения :) Всё хочу о ней статью написать. Пожалуй, сделаю это в ближайшее время.

Сергей комментирует...

Доброго времени суток! :-)
Долго проект с Netlib компилируется? У меня беда - минут по 5 и то в итоге с ошибками переполнения кучи компилятора.
Как с этим бороться? Что "подпиливали"? :)

obu комментирует...

Давно уже есть версия 0.8
http://cpp-netlib.blogspot.com/
Автор на sf.net не публикует уже исходники давно похоже.