Example #1
0
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));
}
Example #2
0
 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;
     }
 }