<?xml version="1.0" encoding="ISO-8859-1" ?>
<!--
  ~  Licensed to the Apache Software Foundation (ASF) under one
  ~  or more contributor license agreements.  See the NOTICE file
  ~  distributed with this work for additional information
  ~  regarding copyright ownership.  The ASF licenses this file
  ~  to you under the Apache License, Version 2.0 (the
  ~  "License"); you may not use this file except in compliance
  ~  with the License.  You may obtain a copy of the License at
  ~
  ~   http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~  Unless required by applicable law or agreed to in writing,
  ~  software distributed under the License is distributed on an
  ~   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  ~  KIND, either express or implied.  See the License for the
  ~  specific language governing permissions and limitations
  ~  under the License.
  -->

<document>
    <properties>
        <title>Apache Synapse - Sample 371</title>
    </properties>
    <body>
        <section name="Sample 371: Restricting Requests Based on Policies">
            <div class="xmlConf">&lt;definitions xmlns="http://ws.apache.org/ns/synapse"&gt;

    &lt;sequence name="main"&gt;
        &lt;in&gt;
            &lt;throttle id="A"&gt;
                &lt;policy&gt;
                    &lt;!-- define throttle policy --&gt;
                    &lt;wsp:Policy xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
                                xmlns:throttle="http://www.wso2.org/products/wso2commons/throttle"&gt;
                        &lt;throttle:ThrottleAssertion&gt;
                            &lt;wsp:All&gt;
                                &lt;throttle:ID throttle:type="IP"&gt;other&lt;/throttle:ID&gt;
                                &lt;wsp:ExactlyOne&gt;
                                    &lt;wsp:All&gt;
                                        &lt;throttle:MaximumCount&gt;4&lt;/throttle:MaximumCount&gt;
                                        &lt;throttle:UnitTime&gt;800000&lt;/throttle:UnitTime&gt;
                                        &lt;throttle:ProhibitTimePeriod wsp:Optional="true"&gt;10000
                                        &lt;/throttle:ProhibitTimePeriod&gt;
                                    &lt;/wsp:All&gt;
                                    &lt;throttle:IsAllow&gt;true&lt;/throttle:IsAllow&gt;
                                &lt;/wsp:ExactlyOne&gt;
                            &lt;/wsp:All&gt;
                            &lt;wsp:All&gt;
                                &lt;throttle:ID throttle:type="IP"&gt;192.168.8.200-192.168.8.222
                                &lt;/throttle:ID&gt;
                                &lt;wsp:ExactlyOne&gt;
                                    &lt;wsp:All&gt;
                                        &lt;throttle:MaximumCount&gt;8&lt;/throttle:MaximumCount&gt;
                                        &lt;throttle:UnitTime&gt;800000&lt;/throttle:UnitTime&gt;
                                        &lt;throttle:ProhibitTimePeriod wsp:Optional="true"&gt;10
                                        &lt;/throttle:ProhibitTimePeriod&gt;
                                    &lt;/wsp:All&gt;
                                    &lt;throttle:IsAllow&gt;true&lt;/throttle:IsAllow&gt;
                                &lt;/wsp:ExactlyOne&gt;
                            &lt;/wsp:All&gt;
                            &lt;wsp:All&gt;
                                &lt;throttle:ID throttle:type="IP"&gt;192.168.8.201&lt;/throttle:ID&gt;
                                &lt;wsp:ExactlyOne&gt;
                                    &lt;wsp:All&gt;
                                        &lt;throttle:MaximumCount&gt;200&lt;/throttle:MaximumCount&gt;
                                        &lt;throttle:UnitTime&gt;600000&lt;/throttle:UnitTime&gt;
                                        &lt;throttle:ProhibitTimePeriod wsp:Optional="true"/&gt;
                                    &lt;/wsp:All&gt;
                                    &lt;throttle:IsAllow&gt;true&lt;/throttle:IsAllow&gt;
                                &lt;/wsp:ExactlyOne&gt;
                            &lt;/wsp:All&gt;
                            &lt;wsp:All&gt;
                                &lt;throttle:ID throttle:type="IP"&gt;192.168.8.198&lt;/throttle:ID&gt;
                                &lt;wsp:ExactlyOne&gt;
                                    &lt;wsp:All&gt;
                                        &lt;throttle:MaximumCount&gt;50&lt;/throttle:MaximumCount&gt;
                                        &lt;throttle:UnitTime&gt;500000&lt;/throttle:UnitTime&gt;
                                        &lt;throttle:ProhibitTimePeriod wsp:Optional="true"/&gt;
                                    &lt;/wsp:All&gt;
                                    &lt;throttle:IsAllow&gt;true&lt;/throttle:IsAllow&gt;
                                &lt;/wsp:ExactlyOne&gt;
                            &lt;/wsp:All&gt;
                        &lt;/throttle:ThrottleAssertion&gt;
                    &lt;/wsp:Policy&gt;
                &lt;/policy&gt;
                &lt;onAccept&gt;
                    &lt;log level="custom"&gt;
                        &lt;property name="text" value="**Access Accept**"/&gt;
                    &lt;/log&gt;
                    &lt;send&gt;
                        &lt;endpoint&gt;
                            &lt;address uri="http://localhost:9000/services/SimpleStockQuoteService"/&gt;
                        &lt;/endpoint&gt;
                    &lt;/send&gt;
                &lt;/onAccept&gt;
                &lt;onReject&gt;
                    &lt;log level="custom"&gt;
                        &lt;property name="text" value="**Access Denied**"/&gt;
                    &lt;/log&gt;
                    &lt;makefault response="true"&gt;
                        &lt;code xmlns:tns="http://www.w3.org/2003/05/soap-envelope"
                              value="tns:Receiver"/&gt;
                        &lt;reason value="**Access Denied**"/&gt;
                    &lt;/makefault&gt;
                    &lt;send/&gt;
                    &lt;drop/&gt;
                &lt;/onReject&gt;
            &lt;/throttle&gt;
        &lt;/in&gt;
        &lt;out&gt;
            &lt;throttle id="A"/&gt;
            &lt;send/&gt;
        &lt;/out&gt;
    &lt;/sequence&gt;

&lt;/definitions&gt;</div>
            <subsection name="Objective">
                <p>
                    Demonstrate how to throttle incoming requests based on complex policies
                </p>
            </subsection>
            <subsection name="Pre-requisites">
                <p>
                    <ul>
                        <li>
                            Deploy the SimpleStockQuoteService in the sample Axis2 server and start Axis2
                        </li>
                        <li>
                            Start Synapse using the configuration numbered 371 (repository/conf/sample/synapse_sample_371.xml)
                            <div class="command">
                                Unix/Linux: sh synapse.sh -sample 371<br/>
                                Windows: synapse.bat -sample 371
                            </div>
                        </li>
                    </ul>
                </p>
            </subsection>
            <subsection name="Executing the Client">
                <p>
                    Above configuration specifies a throttle mediator inside the in mediator.
                    Therefore, all request messages directed to the main sequence will be subjected
                    to throttling. Throttle mediator has policy, onAccept and onReject tags at the
                    top level. Policy tag specifies the throttling policy against which all messages
                    will be evaluated. It contains some IP address ranges and the maximum number of
                    messages to be allowed for those ranges within a time period given in 'UnitTime'
                    tag. 'ProhibitTimePeriod' tag specifies the time period to prohibit further
                    requests after the received request count exceeds the specified time. Now run the
                    client 5 times repetitively using the following command to see how throttling works.
                </p>
                <div class="command">ant stockquote -Dsymbol=IBM -Dmode=quote -Daddurl=http://localhost:8280/</div>
                <p>
                    For the first four requests you will get the quote prices for IBM as follows.
                </p>
                <div class="consoleOutput">[java] Standard :: Stock price = $177.20143371883802</div>
                <p>
                    Fifth request will not be sent to the Axis2 server and the client will receive
                    the following fault.
                </p>
                <div class="consoleOutput">[java] org.apache.axis2.AxisFault: **Access Denied**</div>
                <p>
                    Maximum number of requests within 800000 milliseconds is specified as 4 for any
                    server (including localhost) other than the explicitly specified ones. Therefore,
                    our fifth request is denied by the throttle mediator. You can verify this by looking
                    at the Synapse console.
                </p>
                <div class="consoleOutput">[HttpServerWorker-1] INFO  LogMediator - text = **Access Accept**
[HttpServerWorker-2] INFO  LogMediator - text = **Access Accept**
[HttpServerWorker-3] INFO  LogMediator - text = **Access Accept**
[HttpServerWorker-4] INFO  LogMediator - text = **Access Accept**
[HttpServerWorker-5] INFO  LogMediator - text = **Access Denied**</div>
            </subsection>
        </section>
        <p><a href="../samples.html">Back to Catalog</a></p>        
    </body>
</document>