[Dancer-users] running an Apache cgi via Dancer

Puneet Kishor punk.kish at gmail.com
Tue Dec 6 21:38:03 CET 2011


I might have asked this question earlier, but in any case, here goes again. Hopefully one of knowledgable folks can guide me toward the right path.

I have my Dancer app running behind an Apache2 proxy, so when the user goes to `http://server/app`, apache serves content retrieved from `http://127.0.0.1:port/` that is being served by Starman+Dancer.

My application also serves maps via Apache+MapServer from `http://server/cgi-bin/mapserv`. 

In reality, I have not just `/app` but `/app1`, `/app2`, `/app3` and so on. In order to send `/app<n>` specific MapServer information to the cgi program, I have shell script wrappers called `app1`, `app2`, `app3` in my cgi-bin directory. Their content is like so ("app<n>.map" is a "mapfile" for app<n>. There is one for each app).

    #!/bin/sh

    MAPSERV="/path/to/punkish/cgi-bin/mapserv"
    MAPFILE="/path/to/app<n>.map"
    if [ "${REQUEST_METHOD}" = "GET" ]; then
        if [ -z "${QUERY_STRING}" ]; then
            QUERY_STRING="map=${MAPFILE}"
        else
            QUERY_STRING="map=${MAPFILE}&${QUERY_STRING}"
        fi
        exec ${MAPSERV}
    else
        echo "Sorry, I only understand GET requests."
    fi
    exit 1

With that background, I now have all my app-specific stuff in my Dancer directory, except this shell script that is in the apache cgi-bin directory. This makes management difficult, and I would like to move these files to the Dancer directory. Except, I haven't been able to figure out how to execute apache cgi-bin programs from Dancer. I tried the following in my app but I get a 502 Proxy Error.

    # http://server/app/ms
    get '/ms' => sub {
        my $MAPSERV = '/path/to/punkish/cgi-bin/mapserv';
        my $MAPFILE = '/path/to/app.map';
    
        my $params = params();
        my $QUERY_STRING = "";
        while (my ($k, $v) = each %$params) {
            $QUERY_STRING .= "$k=$v";
        }
        $QUERY_STRING .= "&$MAPFILE";
        
        exec("$MAPSERV $QUERY_STRING");
    };

In other words, I want to take the /ms route and send it off to Apache to execute (via Apache's cgi interface) and return the content via Dancer. That sounds like I want to use Dancer as a proxy for Apache while Apache is already a proxy for Dancer, but actually, all I want is to store certain files under the Dancer app directory, but let Apache handle them instead of Dancer.

Suggestions? 

--
Puneet Kishor



More information about the Dancer-users mailing list