org.geowebcache.proxy.ProxyDispatcher.java Source code

Java tutorial

Introduction

Here is the source code for org.geowebcache.proxy.ProxyDispatcher.java

Source

/**
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 * 
 * @author Arne Kepp, The Open Planning Project, Copyright 2008
 */

package org.geowebcache.proxy;

import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLDecoder;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

public class ProxyDispatcher extends AbstractController {
    private static Log log = LogFactory.getLog(org.geowebcache.proxy.ProxyDispatcher.class);

    private static long lastRequest = System.currentTimeMillis();

    protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        String methStr = request.getMethod();
        if (!methStr.equalsIgnoreCase("POST")) {
            throw new ServletException("Illegal method " + methStr + " for this proxy.");
        }

        String urlStr = request.getParameter("url");
        if (urlStr == null || urlStr.length() == 0 || !urlStr.startsWith("http://")) {
            throw new ServletException("Expected url parameter.");
        }

        synchronized (this) {
            long time = System.currentTimeMillis();
            if (time - lastRequest < 1000) {
                throw new ServletException("Only one request per second please.");
            } else {
                lastRequest = time;
            }
        }

        log.info("Proxying request for " + request.getRemoteAddr() + " to " + " " + urlStr);

        String charEnc = request.getCharacterEncoding();
        if (charEnc == null) {
            charEnc = "UTF-8";
        }
        String decodedUrl = URLDecoder.decode(urlStr, charEnc);

        URL url = new URL(decodedUrl);
        HttpURLConnection wmsBackendCon = (HttpURLConnection) url.openConnection();

        if (wmsBackendCon.getContentEncoding() != null) {
            response.setCharacterEncoding(wmsBackendCon.getContentEncoding());
        }

        response.setContentType(wmsBackendCon.getContentType());

        int read = 0;
        byte[] data = new byte[1024];
        while (read > -1) {
            read = wmsBackendCon.getInputStream().read(data);
            if (read > -1) {
                response.getOutputStream().write(data, 0, read);
            }
        }

        return null;
    }
}