Browse Source

Forwarder integrated to service

master
Artyom Beilis 14 years ago
parent
commit
117f88e87b
6 changed files with 55 additions and 1 deletions
  1. +2
    -0
      cppcms/service.h
  2. +13
    -0
      private/scgi_header.h
  3. +1
    -0
      private/service_impl.h
  4. +11
    -0
      src/config.js
  5. +2
    -0
      src/forwarder.cpp
  6. +26
    -1
      src/service.cpp

+ 2
- 0
cppcms/service.h View File

@@ -44,6 +44,7 @@ namespace cppcms {
class session_pool;
class cache_pool;
class views_pool;
class forwarder;
namespace json {
class value;
@@ -66,6 +67,7 @@ namespace cppcms {
cppcms::session_pool &session_pool();
cppcms::views_pool &views_pool();
cppcms::cache_pool &cache_pool();
cppcms::forwarder &forwarder();

locale::generator const &generator();
std::locale locale();


+ 13
- 0
private/scgi_header.h View File

@@ -0,0 +1,13 @@
#ifndef CPPCMS_SCGI_HEADER_H
#define CPPCMS_SCGI_HEADER_H

#include <map>
#include <string>

namespace cppcms {
namespace impl {
CPPCMS_API std::string make_scgi_header(std::map<std::string,std::string> const &env,size_t addon_size);
}
}

#endif

+ 1
- 0
private/service_impl.h View File

@@ -59,6 +59,7 @@ namespace impl {
std::auto_ptr<views_pool> views_pool_;
std::auto_ptr<cache_pool> cache_pool_;
std::auto_ptr<session_pool> session_pool_;
std::auto_ptr<cppcms::forwarder> forwarder_;
std::locale default_locale_;

std::vector<booster::function<void()> > on_fork_;


+ 11
- 0
src/config.js View File

@@ -115,6 +115,17 @@
"id" : "cppcms",
"options" : [ "LOG_CONS" ]
}
},
"forwarding" : {
"rules" : [
//{
// "host" : "www.google.com",
// "script_name" : ".*\\.php",
// "path_info" : "/foo.*",
// "ip" : "127.0.0.1",
// "port" : 5604
//},
]
}
}

+ 2
- 0
src/forwarder.cpp View File

@@ -33,6 +33,8 @@

#include <booster/shared_ptr.h>
#include <booster/enable_shared_from_this.h>
#include <scgi_header.h>


#ifdef CPPCMS_USE_EXTERNAL_BOOST
# include <boost/bind.hpp>


+ 26
- 1
src/service.cpp View File

@@ -38,6 +38,7 @@
#include <cppcms/thread_pool.h>
#include <cppcms/cppcms_error.h>
#include <cppcms/mount_point.h>
#include <cppcms/forwarder.h>
#include "cgi_acceptor.h"
#include "cgi_api.h"
#ifdef CPPCMS_HAS_SCGI
@@ -369,9 +370,34 @@ void service::after_fork(booster::function<void()> const &cb)
impl_->on_fork_.push_back(cb);
}

cppcms::forwarder &service::forwarder()
{
if(!impl_->forwarder_.get()) {
impl_->forwarder_.reset(new cppcms::forwarder());
if(settings().find("forwarding.rules").type()==json::is_array) {
json::array rules=settings().at("forwarding.rules").array();
for(unsigned i=0;i<rules.size();i++) {
mount_point mp;
if(rules[i].find("host").type()==json::is_string)
mp.host(booster::regex(rules[i].get<std::string>("host")));
if(rules[i].find("script_name").type()==json::is_string)
mp.script_name(booster::regex(rules[i].get<std::string>("script_name")));
if(rules[i].find("path_info").type()==json::is_string)
mp.path_info(booster::regex(rules[i].get<std::string>("path_info")));
std::string ip=rules[i].get<std::string>("ip");
int port=rules[i].get<int>("port");
impl_->forwarder_->add_forwarding_rule(booster::shared_ptr<mount_point>(new mount_point(mp)),ip,port);
}
}
}
return *impl_->forwarder_;
}


void service::run()
{
generator();
forwarder();
session_pool().init();
start_acceptor();

@@ -730,7 +756,6 @@ booster::aio::io_service &service::get_io_service()
return impl_->get_io_service();
}


namespace impl {
service::service() :
io_service_(new io::io_service()),


Loading…
Cancel
Save