<?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" logFileName="JellyLogFileTest.log"/>

    <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>
