#include #include #include #include #include #include #include class serverObj : public x::http::fdserverimpl, virtual public x::obj { public: x::fdlistener daemon; serverObj(const x::fdlistener &daemonArg) : daemon(daemonArg) { } ~serverObj() { } struct file { std::string name; std::string filename; size_t size; file(const std::string &nameArg, const std::string &filenameArg) : name(nameArg), filename(filenameArg), size(0) { } }; void received(const x::http::requestimpl &req, bool hasbody) { std::vector files; std::pair form=this->getform (req, hasbody, [&files] (const x::headersbase &headers, const std::string &name_utf8, const std::string &filename_utf8, x::http::form::parameters::base::filereceiver &recv) { files.emplace_back(name_utf8, filename_utf8); recv.receive([&files] (const std::vector &chunk) { files.back().size += chunk.size(); }, [] { // Close not implemented }); }, "UTF-8"); if (!form.second && hasbody) { received_unknown_request(req, hasbody); // Throws an exception. return; } std::stringstream o; o << "Your request"; bool stop=form.first->find("stop") != form.first->end(); if (stop) { o << "

Goodbye

"; } else { o << "

Form upload test

"; if (!files.empty()) { o << "" "" "" "" "" "" "" "" ""; for (const auto &file:files) { o << ""; } o << "
field namefilenamesize
" << x::xml::escapestr(file.name) << "" << x::xml::escapestr(file.filename) << "" << file.size << "
"; } o << "

Upload a file:

" "" "
Upload a file:

"; } o << ""; send(req, "text/html; charset=utf-8", std::istreambuf_iterator(o.rdbuf()), std::istreambuf_iterator()); if (stop) { daemon->stop(); } } }; class serverfactoryObj : virtual public x::obj { public: x::fdlistener daemon; serverfactoryObj(const x::fdlistener &daemonArg) : daemon(daemonArg) {} ~serverfactoryObj() {} x::ref create() { return x::ref::create(daemon); } }; int main() { try { auto listener=({ std::list socketlist; x::netaddr::create("", 0) ->bind(socketlist, false); std::cout << "Listening on port " << socketlist.front()->getsockname() ->port() << std::endl; x::fdlistener::create(socketlist); }); listener->start(x::http::fdserver::create(), x::ref::create(listener)); listener->wait(); } catch (const x::exception &e) { std::cerr << e << std::endl; exit(1); } return 0; }