#include #include #include #include #include #include #include #include #include #include class listenersObj : virtual public x::obj { public: x::gnutls::session::base::factory factory; x::fdlistener http_listener; x::fdlistener https_listener; static x::fdlistener create_listener(const char *port) { std::list socketlist; x::netaddr::create("", 0)->bind(socketlist, false); std::cout << "Listening on " << port << " port " << socketlist.front()->getsockname()->port() << std::endl; return x::fdlistener::create(socketlist); } static x::gnutls::session::base::factory create_factory() { std::cout << "Creating certificate" << std::endl; x::gnutls::credentials::certificate cred(x::gnutls::credentials::certificate::create()); x::gnutls::x509::privkey key(x::gnutls::x509::privkey::create()); key->generate(GNUTLS_PK_RSA, GNUTLS_SEC_PARAM_NORMAL); key->fix(); x::gnutls::x509::crt cert(x::gnutls::x509::crt::create()); time_t now=time(NULL); cert->set_basic_constraints(true, 1); cert->set_activation_time(now-60); cert->set_expiration_time(now + 60 * 60 * 24 * 30); cert->set_dn_by_oid(GNUTLS_OID_X520_COMMON_NAME, "localhost"); cert->set_issuer_dn_by_oid(GNUTLS_OID_X520_COMMON_NAME, "localhost"); cert->set_key(key); cert->set_serial(1); cert->set_version(); cert->sign(cert, key); std::list certchain; certchain.push_back(cert); cred->set_key(certchain, key); x::gnutls::session::base::factory f(x::gnutls::session::base ::factory::create()); f->credentials_set(cred); return f; } listenersObj() : factory(create_factory()), http_listener(create_listener("http")), https_listener(create_listener("https")) { } ~listenersObj() {} }; typedef x::ref listeners; template class myserverimpl : public impl_class, virtual public x::obj { public: listeners daemons; myserverimpl(const listeners &daemonsArg) : daemons(daemonsArg) { } ~myserverimpl() { } void received(const x::http::requestimpl &req, bool hasbody) { std::pair form=this->getform(req, hasbody); if (!form.second && hasbody) { impl_class::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 << "

Your request headers:

" "

URI: " << x::xml::escapestr(x::to_string(req.get_URI())) << "

"; for (auto hdr:req) { o << ""; } o << "
HeaderContents
" << x::xml::escapestr(hdr.first) << "" << x::xml::escapestr(hdr.second.begin(), hdr.second.end()) << "
" << "

Your form parameters

" ""; for (auto p:*form.first) { o << ""; } o << "
ParameterValue
" << x::xml::escapestr(p.first) << "" << x::xml::escapestr(p.second) << "

Submit a form, and see what happens:

" "" "" "
Text input:
Checkbox:

"; } o << ""; this->send(req, "text/html; charset=utf-8", std::istreambuf_iterator(o.rdbuf()), std::istreambuf_iterator()); if (stop) { daemons->http_listener->stop(); daemons->https_listener->stop(); } } }; template class myhttpserver : virtual public x::obj { public: listeners daemons; myhttpserver(const listeners &daemonsArg) : daemons(daemonsArg) { } ~myhttpserver() {} server_type create() { return server_type::create(daemons); } }; typedef x::ref > > > http_instance; typedef x::ref > > > https_instance; int main() { try { auto daemons(listeners::create()); daemons->http_listener ->start(x::http::fdserver::create(), http_instance::create(daemons)); daemons->https_listener ->start(x::gnutls::http::fdtlsserver::create(), daemons->factory, https_instance::create(daemons)); daemons->http_listener->wait(); daemons->https_listener->wait(); } catch (const x::exception &e) { std::cerr << e << std::endl; exit(1); } return 0; }