<?xml version="1.0"?>
<!--
  Copyright 2002,2004 The Apache Software Foundation.
  
  Licensed 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.
-->
<j:jelly
    xmlns:j="jelly:core"
    xmlns="jelly:jetty"
    xmlns:http="jelly:http"
    trim="false">

    <j:set var="contextPathVar" value="/resourceHandlerTest"/>
    <j:set var="testPort" value="8100"/>
    <j:set var="testUri" value="http://localhost:${testPort}${contextPathVar}/resourceHandlerTest.txt"/>

    <jettyHttpServer var="httpServerUnauthorized">
      <socketListener port="${testPort}"/>
      <realm name="Demo Realm" config="setup/demoRealm.properties"/>
      <httpContext contextPath="${contextPathVar}" resourceBase="./docRoot/resourceHandlerTest" realmName="Demo Realm">
          <securityHandler>
            <constraints>

              <security-constraint>
                <web-resource-collection>
                 <web-resource-name>Default</web-resource-name>
                  <url-pattern>/</url-pattern>
                </web-resource-collection>
                <auth-constraint>
                  <role-name>*</role-name>
                </auth-constraint>
              </security-constraint>

              <login-config>
                <auth-method>BASIC</auth-method>
                <realm-name>Demo Realm</realm-name>
              </login-config>

            </constraints>
          </securityHandler>

          <resourceHandler/>
      </httpContext>
    </jettyHttpServer>

    <!-- get with no authentication should fail with Unauthorized -->
    <http:get var="mtc1" uri="${testUri}"/>

    <j:choose>
      <j:when test="${mtc1.statusCode == 401}">
          <!-- get with authentication in controlled area should work-->
          <http:get var="mtc2" uri="${testUri}">
             <http:header name="Authorization" value="Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=="/>
          </http:get>
          <j:choose>
              <j:when test="${mtc2.statusCode == 200}">
                  It works!
              </j:when>
              <j:otherwise>
                Results for mtc2 url are:
                http return code = ${mtc2.statusCode}
                http status text = '${mtc2.statusText}'
              </j:otherwise>
          </j:choose>
      </j:when>

      <j:otherwise>
        Results for mtc1 url are:
        http return code = ${mtc1.statusCode}
        http status text = '${mtc1.statusText}'
      </j:otherwise>
    </j:choose>
    ${httpServerUnauthorized.stop(false)}

</j:jelly>
