void kul::https::Server::loop() throw(kul::tcp::Exception){ KUL_DBG_FUNC_ENTER int32_t newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); if(newsockfd < 0) KEXCEPTION("HTTPS Server error on accept"); ssl = SSL_new(ctx); SSL_set_fd(ssl, newsockfd); //Here is the SSL Accept portion. Now all reads and writes must use SSL int16_t ssl_err = SSL_accept(ssl); if(ssl_err <= 0){ short se = 0; SSL_get_error(ssl, se); KERR << "HTTPS Server SSL ERROR on SSL_ACCEPT error: " << se; close(newsockfd); return; } KLOG(DBG) << "SSL_get_cipher: " << SSL_get_cipher(ssl); cc = SSL_get_peer_certificate (ssl); if(cc != NULL) { KLOG(DBG) << "Client certificate:"; KLOG(DBG) << "\t subject: " << X509_NAME_oneline (X509_get_subject_name (cc), 0, 0); KLOG(DBG) << "\t issuer: %s\n" << X509_NAME_oneline (X509_get_issuer_name (cc), 0, 0); X509_free(cc); }else KLOG(ERR) << "Client does not have certificate."; KOUT(DBG) << "New connection , socket fd is " << newsockfd << ", is : " << inet_ntoa(cli_addr.sin_addr) << ", port : "<< ntohs(cli_addr.sin_port); onConnect(inet_ntoa(cli_addr.sin_addr), ntohs(cli_addr.sin_port)); int16_t e; char buffer[_KUL_HTTPS_READ_BUFFER_]; std::stringstream cnt; do{ bzero(buffer,_KUL_HTTPS_READ_BUFFER_); e = SSL_read(ssl, buffer, _KUL_HTTPS_READ_BUFFER_ - 1); if(e) cnt << buffer; }while(e == (_KUL_HTTPS_READ_BUFFER_ - 1)); if (e < 0){ short se = 0; SSL_get_error(ssl, se); if(se) KLOG(ERR) << "SSL_get_error: " << se; e = -1; }else try{ std::string res; std::shared_ptr<kul::http::ARequest> req = handleRequest(cnt.str(), res); const kul::http::AResponse& rs(respond(*req.get())); std::string ret(rs.toString()); e = SSL_write(ssl, ret.c_str(), ret.length()); }catch(const kul::http::Exception& e1){ KERR << e1.what(); e = -1; } close(newsockfd); KOUT(DBG) << "Disconnect , socket fd is " << newsockfd << ", is : " << inet_ntoa(cli_addr.sin_addr) << ", port : "<< ntohs(cli_addr.sin_port); onDisconnect(inet_ntoa(cli_addr.sin_addr), ntohs(cli_addr.sin_port)); }
void operator()() throw(kul::Exception){ std::pair<std::string, std::string> p; { kul::ScopeLock lock(compile); p = sources.front(); sources.pop(); } const std::string src(p.first); const std::string obj(p.second); if(!f){ const std::string& fileType = src.substr(src.rfind(".") + 1); const std::string& compiler = (*(*app.files().find(fileType)).second.find(COMPILER)).second; std::vector<std::string> args; if(app.arguments().count(fileType) > 0) for(const std::string& o : (*app.arguments().find(fileType)).second) for(const auto& s : kul::String::split(o, ' ')) args.push_back(s); for(const auto& s : kul::String::split(app.arg, ' ')) args.push_back(s); std::string cmd = compiler + " " + AppVars::INSTANCE().args(); if(AppVars::INSTANCE().jargs().count(fileType) > 0) cmd += " " + (*AppVars::INSTANCE().jargs().find(fileType)).second; // WE CHECK BEFORE USING THIS THAT A COMPILER EXISTS FOR EVERY FILE if(kul::LogMan::INSTANCE().inf() && !kul::LogMan::INSTANCE().dbg()) KOUT(NON) << compiler << " : " << src; const kul::code::CompilerProcessCapture& cpc = kul::code::Compilers::INSTANCE().get(compiler)->compileSource(cmd, args, incs, src, obj, app.m); kul::ScopeLock lock(push); cpcs.push_back(cpc); if(cpc.exception()) f = 1; } }