void httplus::App::load(kul::hash::map::S2T<std::shared_ptr<http::Server>>& http, kul::hash::map::S2T<std::shared_ptr<https::Server>>& https, Sites& sites) throw(httplus::Exception){ std::shared_ptr<http::Conf> defHttp; if(config.root()["http"]) for(const YAML::Node& c : config.root()["http"]){ if(defHttp && !c["host"]) KEXCEPTION("Only one http allowed without 'host' parameter"); const std::string& port(c["port"] ? c["port"].Scalar() : "80"); kul::Dir d(c["root"].Scalar()); if(!d) KEXCEPTION("Directory does not exist: " + c["root"].Scalar()); kul::Dir p("pub", d); if(!p && !p.mk()) KEXCEPTION("Invalid access on directory: " + d.real()); http::Server* ser = {0}; std::string home(c["home"] ? c["home"].Scalar() : ""); const std::string txt(c["text"] ? c["text"].Scalar() : ""); if(!c["host"]){ defHttp = std::make_shared<http::Conf>(c["root"].Scalar(), home, txt); }else if(sites.count(std::to_string(std::hash<std::string>()(d.real())))){ const Pages& pages((*sites.find(std::to_string(std::hash<std::string>()(d.real())))).second); http.insert(port, std::make_shared<http::Server>(kul::String::UINT16(port), pages)); ser = http[port].get(); ser->confs.insert(c["host"].Scalar(), std::make_shared<http::Conf>(c["root"].Scalar(), home, txt)); }else KERR << "WARN: NO GENERATORS FOR HTTP ROOT: " << d; } for(const auto& p : http) p.second->def = defHttp; if(config.root()["https"]) for(const YAML::Node& c : config.root()["https"]){ kul::Dir d(c["root"].Scalar()); if(!d) KEXCEPTION("Directory does not exist: " + c["root"].Scalar()); kul::Dir p("pub", d); if(!p && !p.mk()) KEXCEPTION("Invalid access on directory: " + d.real()); kul::File crt(c["crt"].Scalar()); kul::File key(c["key"].Scalar()); if(!crt) KEXCEPTION("File does not exist: " + crt.full()); if(!key) KEXCEPTION("File does not exist: " + key.full()); https::Server* ser = {0}; const std::string& port(c["port"] ? c["port"].Scalar() : "443"); const std::string hsh(std::to_string(std::hash<std::string>()(d.real()))); if(!sites.count(hsh)) { KERR << "WARN: NO GENERATORS FOR HTTPS ROOT: " << d; continue; } const Pages& pages((*sites.find(hsh)).second); std::string ssls(c["ssls"] ? c["ssls"].Scalar() : config.root()["ssls"] ? config.root()["ssls"].Scalar() : ""); https.insert(port, std::make_shared<https::Server>(kul::String::UINT16(port), pages, crt, key, ssls)); ser = https[port].get(); ser->init(); if(c["chain"]) ser->setChain(c["chain"].Scalar()); std::string home(c["home"] ? c["home"].Scalar() : ""); const std::string txt(c["text"] ? c["text"].Scalar() : ""); ser->confs.insert(c["host"].Scalar(), std::make_shared<http::Conf>(c["root"].Scalar(), home, txt)); } }
int _tmain(int argc, _TCHAR* argv[]) { const std::string Pop3Server = "pop3.lolipop.jp"; const bool UseSSL = false; const unsigned short Pop3Port = UseSSL ? 995 : 110; const std::string Pop3User = "******"; const std::string Pop3Pass = "******"; UseWinSock ws(2, 2); if( !ws ) return -1; u_long srvr_bin_addr = GetBinAddr(Pop3Server.c_str()); if( INADDR_NONE==srvr_bin_addr ) { return -1; } sockaddr_in ssock_addr; ssock_addr.sin_family = AF_INET; ssock_addr.sin_port = htons(Pop3Port); ssock_addr.sin_addr.s_addr = srvr_bin_addr; SOCKET hServerSock = socket(AF_INET, SOCK_STREAM, 0); if( INVALID_SOCKET == hServerSock ) return -1; AutoCloseSocket CloseSocket(hServerSock); int ws_ret = connect(hServerSock, (sockaddr *)&ssock_addr, sizeof(ssock_addr)); if( SOCKET_ERROR != ws_ret ) { AutoShutdownConnection ShutdownConnection(hServerSock, SD_BOTH); std::cout<<"Connected to: "<<Pop3Server<<" port:"<<Pop3Port<<std::endl; try { LSockByteStream ss(hServerSock); LSSLContext SSLCtx;//in case we will need SSL LSSLByteStream ssls(&ss);//in case we will need SSL if( UseSSL ) { SSLCtx.AcquireCredentials(); SSLCtx.Handshake(&ss, to_wstring(Pop3Server).c_str() ); ssls.SetSSLContext(&SSLCtx); } //POP3 protocol conversation LPop3 pop3( UseSSL ? (LByteStream*)&ssls : (LByteStream*)&ss ); pop3.Greeting(); std::cout<<"Server greeting: "<<pop3.GetResponse(); if( pop3.USER(Pop3User) && pop3.PASS(Pop3Pass) ) { std::cout<<"User name: "<<Pop3User<<std::endl; unsigned int MessagesCount; pop3.STAT(&MessagesCount); std::cout<<"Total messages: "<<MessagesCount<<std::endl<<std::endl; std::vector<char> msg_body; for( unsigned int i=1; i<MessagesCount+1; ++i) { pop3.TOP(i, 100, &msg_body); msg_body.push_back('\0'); std::cout<<"Message #"<<i<<" headers:"<<std::endl; std::cout<<&msg_body[0]; CStringA aa = &msg_body[0]; } } pop3.QUIT(); } catch(LPop3::BAD_POP3_PROTOCOL&){//some problem with POP3 return -1; } catch(LBS_EOF&){//connection closed. return -1; } catch(LSSL_SEC_E&){//some problems with ssl. return -1; } catch(int){//some problem with socket io. return -1; } } else return -1; return 0; }