The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use Mojolicious::Lite;
use Data::Dumper qw/Dumper/;

# This is a test script of a dynamic wadl

get '/wadl' => sub {
    my ($self) = @_;

    $self->render(html => 'wadl', port => $ENV{PORT});
};

my $x_r = 0;
my $i_r = 1;
get '/ping' => sub {
    my ($self) = @_;

    $self->res->headers->header('X-Response-ID', $x_r++);
    $self->res->headers->header('I-Response-ID', $i_r++);
    $self->render( json => {message => 'get'} );
};
post '/ping' => sub {
    my ($self) = @_;

    $self->res->headers->header('X-Response-ID', $x_r++);
    $self->res->headers->header('Response-ID', $i_r++);

    my $status = $self->req->headers->{headers}{'i-status'}[0][0];
    if ( !$status ) {
        warn 1;
        $self->render(json => {message => 'post'}, status => 200 );
    }
    elsif ( $status == 400 ) {
        warn 2;
        $self->render(text => '', status => 400 );
    }
    elsif ( $status == 401 ) {
        warn 3;
        $self->app->types->type( multi => "x-application-urlencoded" );
        $self->render(text => "multi=true", format => 'multi', status => 401 );
    }
    elsif ( $status == 402 ) {
        warn 4;
        $self->app->types->type( form => "application/x-www-form-urlencoded" );
        $self->render(text => "multi=true&form=1", format => 'form', status => 402 );
    }
    elsif ( $status == 403 ) {
        warn 5;
        $self->app->types->type( url => "multipart/form-data" );
        $self->render(text => "multi=true&form=1&url=u", format => 'url', status => 403 );
    }
    elsif ( $status == 404 ) {
        warn 5;
        $self->app->types->type( xml => "text/xml" );
        $self->render(text => "<xml>text</xml>", format => 'xml', status => 404 );
    }
    else {
        warn 6;
        $self->render(json => {message => 'post'}, status => 300 );
    }
};

app->start;

__DATA__

@@ ping.json.ep
{"message":"pong"}

@@ wadl.html.ep
<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://wadl.dev.java.net/2009/02"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:tns="http://rest.domain.gdl.optus.com.au/rest/3/service/bis/ping"
    xmlns:json="http://rest.domain.gdl.optus.com.au/rest/3/common-json"
    xsi:schemaLocation="http://wadl.dev.java.net/2009/02 wadl20090202.xsd
                     http://rest.domain.gdl.optus.com.au/rest/3/service/bis/ping ping.xsd">

    <doc xml:lang="en" title="Business - Ping" version="${project.version}">
        This service provides basic "ping" functionality which allows the calling
        clients/partners to test their connectivity to the platform.
    </doc>
    <resources path="http://localhost:<%= $port || 3000 %>/">
        <resource path="ping" id="Ping">
            <method name="GET" id="ping">
                <doc xml:lang="en" title="Ping">
                    A calling client/partner can request a GET ping to the server
                    to ensure connectivity.
                </doc>
                <request>
                    <param name="X-Request-ID"             style="header" type="xs:string" required="true"/>
                    <param name="X-Request-DateTime"       style="header" type="xs:string" required="true"/>
                    <param name="X-Request-TimeZone"       style="header" type="xs:string" required="true"/>
                    <param name="X-Partner-ID"             style="header" type="xs:string" required="true"/>
                    <param name="I-Request-ID"             style="header" type="xs:string" required="false"/>
                    <param name="I-Correlation-Request-ID" style="header" type="xs:string" required="false"/>
                    <param name="I-Partner-ID"             style="header" type="xs:string" required="false"/>
                    <param name="message"                  style="query"  type="xs:string" required="false"/>
                </request>
                <response status="200">
                    <param name="X-Response-ID"             style="header" type="xs:string" required="true"/>
                    <param name="I-Response-ID"             style="header" type="xs:string" required="false"/>
                    <param name="I-Correlation-Response-ID" style="header" type="xs:string" required="false"/>
                    <representation mediaType="application/json"
                        json:serialize="au.com.optus.gdl.rest.domain.v3.service.ping.dto.PingResponse"/>
                </response>
                <response status="400"/>
            </method>

            <method name="POST" id="pingPost">
                <doc xml:lang="en" title="Ping">
                    A calling client/partner can request a POST ping the server
                    to ensure connectivity.
                </doc>
                <request>
                    <param name="X-Request-ID"             style="header" type="xs:string" required="true"/>
                    <param name="X-Request-DateTime"       style="header" type="xs:string" required="true"/>
                    <param name="X-Request-TimeZone"       style="header" type="xs:string" required="true"/>
                    <param name="X-Partner-ID"             style="header" type="xs:string" required="true"/>
                    <param name="I-Request-ID"             style="header" type="xs:string" required="false"/>
                    <param name="I-Correlation-Request-ID" style="header" type="xs:string" required="false"/>
                    <param name="I-Partner-ID"             style="header" type="xs:string" required="false"/>
                    <param name="I-Status"                 style="header" type="xs:string" required="false"/>
                    <representation mediaType="application/json"
                        json:serialize="au.com.optus.gdl.rest.domain.v3.service.ping.dto.PingRequest"/>
                </request>
                <response status="200">
                    <param name="Response-ID"               style="header" type="xs:string" required="true"/>
                    <param name="X-Response-ID"             style="header" type="xs:string" required="true"/>
                    <param name="I-Response-ID"             style="header" type="xs:string" required="false"/>
                    <param name="I-Correlation-Response-ID" style="header" type="xs:string" required="false"/>
                    <representation mediaType="application/json"
                        json:serialize="au.com.optus.gdl.rest.domain.v3.service.ping.dto.PingResponse"/>
                </response>
                <response status="400"/>
                <response status="401">
                    <representation mediaType="x-application-urlencoded">
                        <param name="multi" style="query" type="xs:string" required="true" />
                    </representation>
                </response>
                <response status="402">
                    <representation mediaType="application/x-www-form-urlencoded">
                        <param name="form" style="query" type="xs:string" required="true" />
                    </representation>
                </response>
                <response status="403">
                    <representation mediaType="multipart/form-data">
                        <param name="url" style="query" type="xs:string" required="true" />
                    </representation>
                </response>
                <response status="404">
                    <representation mediaType="text/xml" />
                </response>
                <response status="412">
                    <representation mediaType="application/json"
                        json:serialize="au.com.optus.gdl.rest.domain.v3.service.ping.dto.PingResponse"/>
                    <representation mediaType="application/xml"/>
                </response>
            </method>

        </resource>
    </resources>
</application>