<?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=""/>
    <j:set var="testPort" value="8100"/>
    <j:set var="testUri" value="http://localhost:${testPort}${contextPathVar}/test1.txt"/>

    <jettyHttpServer var="httpServer"/>

    <http:get var="mtc" uri="${testUri}"/>
    <j:if test='${mtc.statusCode == 200}'>
        ${mtc.responseBodyAsString}
    </j:if>
    <j:if test='${mtc.statusCode != 200}'>
        Results for mtc url are:
        http return code = ${mtc.statusCode}
        http status text = '${mtc.statusText}'
        size of result = ${mtc.responseBodyAsString.length()}
        response time = ${mtc.responseTime}

            <j:forEach items="${mtc.responseHeaders}" var="header" indexVar="i">
                header[${i}] = ${header}
            </j:forEach>
    </j:if>
    ${httpServer.stop()}

</j:jelly>
