You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@trafficserver.apache.org by Igor Galić <i....@brainsware.org> on 2013/08/22 09:24:31 UTC

Re: git commit: TS-2107: change proxy.config.http.transaction_active_timeout_in


----- Original Message -----
> Updated Branches:
>   refs/heads/master 2e8f0c352 -> e5d27294b
> 
> 
> TS-2107: change proxy.config.http.transaction_active_timeout_in
> 
> split proxy.config.http.transaction_active_timeout_in to
> proxy.config.http.transaction_header_timeout_in
> and proxy.config.http.transaction_request_timeout_in.


doc/reference/configuration/records.config.en.rst
644:.. ts:cv:: CONFIG proxy.config.http.transaction_active_timeout_in INT 0

lib/perl/examples/forw_proxy_conf.pl
36:$recedit->set(conf => "proxy.config.http.transaction_active_timeout_in", val => "1800");

lib/perl/lib/Apache/TS/AdminClient.pm
517: proxy.config.http.transaction_active_timeout_in



> Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
> Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/e5d27294
> Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/e5d27294
> Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/e5d27294
> 
> Branch: refs/heads/master
> Commit: e5d27294be996520588825bad8c82788e15dde85
> Parents: 2e8f0c3
> Author: Chen Bin <ku...@taobao.com>
> Authored: Thu Aug 22 13:47:30 2013 +0800
> Committer: Chen Bin <ku...@taobao.com>
> Committed: Thu Aug 22 13:49:39 2013 +0800
> 
> ----------------------------------------------------------------------
>  CHANGES                                |  3 +++
>  mgmt/RecordsConfig.cc                  |  4 +++-
>  mgmt/cli/ConfigCmd.cc                  |  9 +++++----
>  mgmt/cli/ConfigCmd.h                   |  3 ++-
>  mgmt/cli/ShowCmd.cc                    |  9 ++++++---
>  mgmt/cli/cli_detailed_command_list.txt |  6 ++++--
>  proxy/http/HttpConfig.cc               |  8 ++++++--
>  proxy/http/HttpConfig.h                |  9 +++++++--
>  proxy/http/HttpSM.cc                   | 27 +++++++++++++++++++++++++--
>  9 files changed, 61 insertions(+), 17 deletions(-)
> ----------------------------------------------------------------------
> 
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e5d27294/CHANGES
> ----------------------------------------------------------------------
> diff --git a/CHANGES b/CHANGES
> index c2e5d1b..cadbb34 100644
> --- a/CHANGES
> +++ b/CHANGES
> @@ -2,6 +2,9 @@
>  Changes with Apache Traffic Server 4.1.0
>  
>  
> +  *) [TS-2107] split proxy.config.http.transaction_active_timeout_in to
> proxy.config.http.transaction_header_timeout_in
> +     and proxy.config.http.transaction_request_timeout_in.
> +
>    *) [TS-2114] buffer_upload plugin defines true and false
>      Author: Kit Chan <ch...@gmail.com>
>  
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e5d27294/mgmt/RecordsConfig.cc
> ----------------------------------------------------------------------
> diff --git a/mgmt/RecordsConfig.cc b/mgmt/RecordsConfig.cc
> index 11f60c7..8e90ac1 100644
> --- a/mgmt/RecordsConfig.cc
> +++ b/mgmt/RecordsConfig.cc
> @@ -506,7 +506,9 @@ RecordElement RecordsConfig[] = {
>    ,
>    {RECT_CONFIG, "proxy.config.http.transaction_no_activity_timeout_out",
>    RECD_INT, "30", RECU_DYNAMIC, RR_NULL, RECC_STR, "^[0-9]+$", RECA_NULL}
>    ,
> -  {RECT_CONFIG, "proxy.config.http.transaction_active_timeout_in", RECD_INT,
> "900", RECU_DYNAMIC, RR_NULL, RECC_STR, "^[0-9]+$", RECA_NULL}
> +  {RECT_CONFIG, "proxy.config.http.transaction_header_active_timeout_in",
> RECD_INT, "0", RECU_DYNAMIC, RR_NULL, RECC_STR, "^[0-9]+$", RECA_NULL}
> +  ,
> +  {RECT_CONFIG, "proxy.config.http.transaction_request_active_timeout_in",
> RECD_INT, "0", RECU_DYNAMIC, RR_NULL, RECC_STR, "^[0-9]+$", RECA_NULL}
>    ,
>    {RECT_CONFIG, "proxy.config.http.transaction_active_timeout_out",
>    RECD_INT, "0", RECU_DYNAMIC, RR_NULL, RECC_STR, "^[0-9]+$", RECA_NULL}
>    ,
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e5d27294/mgmt/cli/ConfigCmd.cc
> ----------------------------------------------------------------------
> diff --git a/mgmt/cli/ConfigCmd.cc b/mgmt/cli/ConfigCmd.cc
> index a40da20..ae7a5c5 100644
> --- a/mgmt/cli/ConfigCmd.cc
> +++ b/mgmt/cli/ConfigCmd.cc
> @@ -978,8 +978,11 @@ Cmd_ConfigHttp(ClientData clientData, Tcl_Interp *
> interp, int argc, const char
>      case CMD_CONFIG_HTTP_INACTIVE_TIMEOUT_OUT:
>        return (Cli_RecordInt_Action(action,
>        "proxy.config.http.transaction_no_activity_timeout_out",
>        argtable->arg_int));
>  
> -    case CMD_CONFIG_HTTP_ACTIVE_TIMEOUT_IN:
> -      return (Cli_RecordInt_Action(action,
> "proxy.config.http.transaction_active_timeout_in", argtable->arg_int));
> +    case CMD_CONFIG_HTTP_HEADER_ACTIVE_TIMEOUT_IN:
> +      return (Cli_RecordInt_Action(action,
> "proxy.config.http.transaction_header_active_timeout_in",
> argtable->arg_int));
> +
> +    case CMD_CONFIG_HTTP_REQUEST_ACTIVE_TIMEOUT_IN:
> +      return (Cli_RecordInt_Action(action,
> "proxy.config.http.transaction_request_active_timeout_in",
> argtable->arg_int));
>  
>      case CMD_CONFIG_HTTP_ACTIVE_TIMEOUT_OUT:
>        return (Cli_RecordInt_Action(action,
>        "proxy.config.http.transaction_active_timeout_out",
>        argtable->arg_int));
> @@ -1039,8 +1042,6 @@ CmdArgs_ConfigHttp()
>    createArgument("inactive-timeout-out", 1, CLI_ARGV_OPTION_INT_VALUE,
>                   (char *) NULL, CMD_CONFIG_HTTP_INACTIVE_TIMEOUT_OUT,
>                   "Inactive timeout outbound <seconds>",
>                   (char *) NULL);
> -  createArgument("active-timeout-in", 1, CLI_ARGV_OPTION_INT_VALUE,
> -                 (char *) NULL, CMD_CONFIG_HTTP_ACTIVE_TIMEOUT_IN, "Active
> timeout inbound <seconds>", (char *) NULL);
>    createArgument("active-timeout-out", 1, CLI_ARGV_OPTION_INT_VALUE,
>                   (char *) NULL, CMD_CONFIG_HTTP_ACTIVE_TIMEOUT_OUT, "Active
>                   timeout outbound <seconds>", (char *) NULL);
>  
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e5d27294/mgmt/cli/ConfigCmd.h
> ----------------------------------------------------------------------
> diff --git a/mgmt/cli/ConfigCmd.h b/mgmt/cli/ConfigCmd.h
> index 42ed681..05473c4 100644
> --- a/mgmt/cli/ConfigCmd.h
> +++ b/mgmt/cli/ConfigCmd.h
> @@ -113,7 +113,8 @@ typedef enum
>    CMD_CONFIG_HTTP_KEEP_ALIVE_TIMEOUT_OUT,
>    CMD_CONFIG_HTTP_INACTIVE_TIMEOUT_IN,
>    CMD_CONFIG_HTTP_INACTIVE_TIMEOUT_OUT,
> -  CMD_CONFIG_HTTP_ACTIVE_TIMEOUT_IN,
> +  CMD_CONFIG_HTTP_HEADER_ACTIVE_TIMEOUT_IN,
> +  CMD_CONFIG_HTTP_REQUEST_ACTIVE_TIMEOUT_IN,
>    CMD_CONFIG_HTTP_ACTIVE_TIMEOUT_OUT,
>    CMD_CONFIG_HTTP_REMOVE_FROM,
>    CMD_CONFIG_HTTP_REMOVE_REFERER,
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e5d27294/mgmt/cli/ShowCmd.cc
> ----------------------------------------------------------------------
> diff --git a/mgmt/cli/ShowCmd.cc b/mgmt/cli/ShowCmd.cc
> index ed71560..138e8cb 100644
> --- a/mgmt/cli/ShowCmd.cc
> +++ b/mgmt/cli/ShowCmd.cc
> @@ -1155,7 +1155,8 @@ ShowHttp()
>    TSInt keepalive_timeout_out = -1;
>    TSInt inactivity_timeout_in = -1;
>    TSInt inactivity_timeout_out = -1;
> -  TSInt activity_timeout_in = -1;
> +  TSInt header_activity_timeout_in = -1;
> +  TSInt request_activity_timeout_in = -1;
>    TSInt activity_timeout_out = -1;
>    TSInt max_alts = -1;
>    TSInt remove_from = -1;
> @@ -1176,7 +1177,8 @@ ShowHttp()
>    Cli_RecordGetInt("proxy.config.http.keep_alive_no_activity_timeout_out",
>    &keepalive_timeout_out);
>    Cli_RecordGetInt("proxy.config.http.transaction_no_activity_timeout_in",
>    &inactivity_timeout_in);
>    Cli_RecordGetInt("proxy.config.http.transaction_no_activity_timeout_out",
>    &inactivity_timeout_out);
> -  Cli_RecordGetInt("proxy.config.http.transaction_active_timeout_in",
> &activity_timeout_in);
> +  Cli_RecordGetInt("proxy.config.http.transaction_header_active_timeout_in",
> &header_activity_timeout_in);
> +
> Cli_RecordGetInt("proxy.config.http.transaction_request_active_timeout_in",
> &request_activity_timeout_in);
>    Cli_RecordGetInt("proxy.config.http.transaction_active_timeout_out",
>    &activity_timeout_out);
>    Cli_RecordGetInt("proxy.config.cache.limits.http.max_alts", &max_alts);
>    Cli_RecordGetInt("proxy.config.http.anonymize_remove_from", &remove_from);
> @@ -1199,7 +1201,8 @@ ShowHttp()
>    Cli_Printf("Keep-Alive Timeout Outbound --- %d s\n",
>    keepalive_timeout_out);
>    Cli_Printf("Inactivity Timeout Inbound ---- %d s\n",
>    inactivity_timeout_in);
>    Cli_Printf("Inactivity Timeout Outbound --- %d s\n",
>    inactivity_timeout_out);
> -  Cli_Printf("Activity Timeout Inbound ------ %d s\n", activity_timeout_in);
> +  Cli_Printf("Header Activity Timeout Inbound ------ %d s\n",
> header_activity_timeout_in);
> +  Cli_Printf("Request Activity Timeout Inbound ------ %d s\n",
> request_activity_timeout_in);
>    Cli_Printf("Activity Timeout Outbound ----- %d s\n",
>    activity_timeout_out);
>    Cli_Printf("Maximum Number of Alternates -- %d\n", max_alts);
>  
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e5d27294/mgmt/cli/cli_detailed_command_list.txt
> ----------------------------------------------------------------------
> diff --git a/mgmt/cli/cli_detailed_command_list.txt
> b/mgmt/cli/cli_detailed_command_list.txt
> index 54b2776..670be8c 100644
> --- a/mgmt/cli/cli_detailed_command_list.txt
> +++ b/mgmt/cli/cli_detailed_command_list.txt
> @@ -362,7 +362,8 @@ http			HTTP Configuration
>      Keep-Alive Timeout Outbound --- 10 s
>      (proxy.config.http.keep_alive_no_activity_timeout_out)
>      Inactivity Timeout Inbound ---- 120 s
>      (proxy.config.http.transaction_no_activity_timeout_in)
>      Inactivity Timeout Outbound --- 120 s
>      (proxy.config.http.transaction_no_activity_timeout_out)
> -    Activity Timeout Inbound ------ 7200 s
> (proxy.config.http.transaction_active_timeout_in)
> +    Header Activity Timeout Inbound ------ 7200 s
> (proxy.config.http.transaction_header_active_timeout_in)
> +    Request Activity Timeout Inbound ------ 7200 s
> (proxy.config.http.transaction_request_active_timeout_in)
>      Activity Timeout Outbound ----- 7200 s
>      (proxy.config.http.transaction_active_timeout_out)
>      Maximum Number of Alternates -- 3
>      (proxy.config.cache.limits.http.max_alts)
>      Remove the following common headers
> @@ -965,7 +966,8 @@ http			HTTP Configuration
>            keep-alive-timeout-out
>            (proxy.config.http.keep_alive_no_activity_timeout_out)
>            inactive-timeout-in
>            (proxy.config.http.transaction_no_activity_timeout_in)
>            inactive-timeout-out
>            (proxy.config.http.transaction_no_activity_timeout_out)
> -          active-timeout-in
> (proxy.config.http.transaction_active_timeout_in)
> +          header-active-timeout-in
> (proxy.config.http.transaction_header_active_timeout_in)
> +          request-active-timeout-in
> (proxy.config.http.transaction_request_active_timeout_in)
>            active-timeout-out
>            (proxy.config.http.transaction_active_timeout_out)
>  
>      ts# config:http keep-alive-timeout-in 10
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e5d27294/proxy/http/HttpConfig.cc
> ----------------------------------------------------------------------
> diff --git a/proxy/http/HttpConfig.cc b/proxy/http/HttpConfig.cc
> index 461a9b7..14cbf1e 100644
> --- a/proxy/http/HttpConfig.cc
> +++ b/proxy/http/HttpConfig.cc
> @@ -1190,7 +1190,10 @@ HttpConfig::startup()
>                                      "proxy.config.http.transaction_no_activity_timeout_in");
>    HttpEstablishStaticConfigLongLong(c.oride.transaction_no_activity_timeout_out,
>                                      "proxy.config.http.transaction_no_activity_timeout_out");
> -  HttpEstablishStaticConfigLongLong(c.transaction_active_timeout_in,
> "proxy.config.http.transaction_active_timeout_in");
> +  HttpEstablishStaticConfigLongLong(c.transaction_header_active_timeout_in,
> "proxy.config.http.transaction_header_active_timeout_in");
> +  HttpEstablishStaticConfigLongLong(c.transaction_request_active_timeout_in,
> "proxy.config.http.transaction_request_active_timeout_in");
> +  if (c.transaction_header_active_timeout_in >=
> c.transaction_request_active_timeout_in)
> +    c.transaction_request_active_timeout_in = 0;
>    HttpEstablishStaticConfigLongLong(c.oride.transaction_active_timeout_out,
>    "proxy.config.http.transaction_active_timeout_out");
>    HttpEstablishStaticConfigLongLong(c.accept_no_activity_timeout,
>    "proxy.config.http.accept_no_activity_timeout");
>  
> @@ -1461,7 +1464,8 @@ HttpConfig::reconfigure()
>    params->oride.keep_alive_no_activity_timeout_out =
>    m_master.oride.keep_alive_no_activity_timeout_out;
>    params->oride.transaction_no_activity_timeout_in =
>    m_master.oride.transaction_no_activity_timeout_in;
>    params->oride.transaction_no_activity_timeout_out =
>    m_master.oride.transaction_no_activity_timeout_out;
> -  params->transaction_active_timeout_in =
> m_master.transaction_active_timeout_in;
> +  params->oride.transaction_header_active_timeout_in =
> m_master.oride.transaction_header_active_timeout_in;
> +  params->oride.transaction_request_active_timeout_in =
> m_master.oride.transaction_request_active_timeout_in;
>    params->oride.transaction_active_timeout_out =
>    m_master.oride.transaction_active_timeout_out;
>    params->accept_no_activity_timeout = m_master.accept_no_activity_timeout;
>    params->oride.background_fill_active_timeout =
>    m_master.oride.background_fill_active_timeout;
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e5d27294/proxy/http/HttpConfig.h
> ----------------------------------------------------------------------
> diff --git a/proxy/http/HttpConfig.h b/proxy/http/HttpConfig.h
> index c220463..04e14cb 100644
> --- a/proxy/http/HttpConfig.h
> +++ b/proxy/http/HttpConfig.h
> @@ -420,6 +420,7 @@ struct OverridableHttpConfigParams {
>        cache_guaranteed_min_lifetime(0),
>        cache_guaranteed_max_lifetime(31536000), cache_max_stale_age(604800),
>        keep_alive_no_activity_timeout_in(115),
>        keep_alive_no_activity_timeout_out(120),
>        transaction_no_activity_timeout_in(30),
>        transaction_no_activity_timeout_out(30),
> +      transaction_header_active_timeout_in(0),
> transaction_request_active_timeout_in(0),
>        transaction_active_timeout_out(0), origin_max_connections(0),
>        connect_attempts_max_retries(0),
>        connect_attempts_max_retries_dead_server(3),
>        connect_attempts_rr_retries(3), connect_attempts_timeout(30),
> @@ -558,6 +559,8 @@ struct OverridableHttpConfigParams {
>    MgmtInt keep_alive_no_activity_timeout_out;
>    MgmtInt transaction_no_activity_timeout_in;
>    MgmtInt transaction_no_activity_timeout_out;
> +  MgmtInt transaction_header_active_timeout_in;
> +  MgmtInt transaction_request_active_timeout_in;
>    MgmtInt transaction_active_timeout_out;
>    MgmtInt origin_max_connections;
>  
> @@ -669,7 +672,8 @@ public:
>    MgmtByte session_auth_cache_keep_alive_enabled;
>    MgmtInt origin_server_pipeline;
>    MgmtInt user_agent_pipeline;
> -  MgmtInt transaction_active_timeout_in;
> +  MgmtInt transaction_header_active_timeout_in;
> +  MgmtInt transaction_request_active_timeout_in;
>    MgmtInt accept_no_activity_timeout;
>  
>    ////////////////////////////////////
> @@ -902,7 +906,8 @@ HttpConfigParams::HttpConfigParams()
>      session_auth_cache_keep_alive_enabled(1),
>      origin_server_pipeline(1),
>      user_agent_pipeline(8),
> -    transaction_active_timeout_in(900),
> +    transaction_header_active_timeout_in(0),
> +    transaction_request_active_timeout_in(0),
>      accept_no_activity_timeout(120),
>      parent_connect_attempts(4),
>      per_parent_connect_attempts(2),
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e5d27294/proxy/http/HttpSM.cc
> ----------------------------------------------------------------------
> diff --git a/proxy/http/HttpSM.cc b/proxy/http/HttpSM.cc
> index ba460da..ad9cd4c 100644
> --- a/proxy/http/HttpSM.cc
> +++ b/proxy/http/HttpSM.cc
> @@ -636,8 +636,11 @@ HttpSM::attach_client_session(HttpClientSession *
> client_vc, IOBufferReader * bu
>    // set up timeouts     //
>    /////////////////////////
>    client_vc->get_netvc()->set_inactivity_timeout(HRTIME_SECONDS(HttpConfig::m_master.accept_no_activity_timeout));
> -
> client_vc->get_netvc()->set_active_timeout(HRTIME_SECONDS(HttpConfig::m_master.transaction_active_timeout_in));
> -
> +  if (HttpConfig::m_master.transaction_header_active_timeout_in)
> +
> client_vc->get_netvc()->set_active_timeout(HRTIME_SECONDS(HttpConfig::m_master.transaction_header_active_timeout_in));
> +  else if (HttpConfig::m_master.transaction_request_active_timeout_in)
> +
> client_vc->get_netvc()->set_active_timeout(HRTIME_SECONDS(HttpConfig::m_master.transaction_request_active_timeout_in));
> +
>    // Add our state sm to the sm list
>    state_add_to_list(EVENT_NONE, NULL);
>  }
> @@ -758,6 +761,7 @@ HttpSM::state_read_client_request_header(int event, void
> *data)
>      milestones.ua_read_header_done = ink_get_hrtime();
>    }
>  
> +  int method;
>    switch (state) {
>    case PARSE_ERROR:
>      DebugSM("http", "[%" PRId64 "] error parsing client request header",
>      sm_id);
> @@ -765,6 +769,7 @@ HttpSM::state_read_client_request_header(int event, void
> *data)
>      // Disable further I/O on the client
>      ua_entry->read_vio->nbytes = ua_entry->read_vio->ndone;
>  
> +    ua_session->get_netvc()->cancel_active_timeout();
>      call_transact_and_set_next_state(HttpTransact::BadRequest);
>      break;
>  
> @@ -776,6 +781,7 @@ HttpSM::state_read_client_request_header(int event, void
> *data)
>        // Disable further I/O on the client
>        ua_entry->read_vio->nbytes = ua_entry->read_vio->ndone;
>  
> +      ua_session->get_netvc()->cancel_active_timeout();
>        call_transact_and_set_next_state(HttpTransact::BadRequest);
>        break;
>      } else if (event == VC_EVENT_READ_COMPLETE) {
> @@ -819,6 +825,21 @@ HttpSM::state_read_client_request_header(int event, void
> *data)
>          (t_state.method == HTTP_WKSIDX_POST &&
>          HttpConfig::m_master.post_copy_size))
>        enable_redirection = HttpConfig::m_master.redirection_enabled;
>  
> +    method = t_state.hdr_info.client_request.method_get_wksidx();
> +    if ((method == HTTP_WKSIDX_POST || method == HTTP_WKSIDX_PUT ||
> (t_state.hdr_info.extension_method &&
> t_state.hdr_info.request_content_length > 0))) {
> +      // is setted
> HttpConfig::m_master.transaction_header_active_timeout_in, so should reset
> active_timeout_in
> +      if (ua_session->get_netvc()->get_active_timeout() ==
> HRTIME_SECONDS(HttpConfig::m_master.transaction_header_active_timeout_in)) {
> +        if (HttpConfig::m_master.transaction_request_active_timeout_in) {
> +          if
> (HRTIME_SECONDS(HttpConfig::m_master.transaction_request_active_timeout_in)
> > (milestones.ua_read_header_done - milestones.sm_start)) {
> +
> ua_session->get_netvc()->set_active_timeout(HRTIME_SECONDS(HttpConfig::m_master.transaction_request_active_timeout_in)
> - (milestones.ua_read_header_done - milestones.sm_start));
> +          }
> +        } else {
> +          ua_session->get_netvc()->cancel_active_timeout();
> +        }
> +      }
> +    } else {
> +      ua_session->get_netvc()->cancel_active_timeout();
> +    }
>      call_transact_and_set_next_state(HttpTransact::ModifyRequest);
>  
>      break;
> @@ -3268,6 +3289,7 @@ HttpSM::tunnel_handler_post_ua(int event,
> HttpTunnelProducer * p)
>    case VC_EVENT_ACTIVE_TIMEOUT:
>      //  Did not complete post tunnling.  Abort the
>      //   server and close the ua
> +    ua_session->get_netvc()->cancel_active_timeout();
>      p->handler_state = HTTP_SM_POST_UA_FAIL;
>      tunnel.chain_abort_all(p);
>      p->read_vio = NULL;
> @@ -3297,6 +3319,7 @@ HttpSM::tunnel_handler_post_ua(int event,
> HttpTunnelProducer * p)
>      p->handler_state = HTTP_SM_POST_SUCCESS;
>      p->read_success = true;
>      ua_entry->in_tunnel = false;
> +    ua_session->get_netvc()->cancel_active_timeout();
>  
>      if (p->do_dechunking || p->do_chunked_passthru) {
>        if (p->chunked_handler.truncation) {
> 
> 

-- 
Igor Galić

Tel: +43 (0) 664 886 22 883
Mail: i.galic@brainsware.org
URL: http://brainsware.org/
GPG: 6880 4155 74BD FD7C B515  2EA5 4B1D 9E08 A097 C9AE