sunlabs.brazil.handler.SupplyHandler Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of sunlabs.brazil Show documentation
Show all versions of sunlabs.brazil Show documentation
Extremely small footprint Java HTTP stack.
The newest version!
/*
* SupplyHandler.java
*
* Brazil project web application toolkit,
* export version: 2.3
* Copyright (c) 1998-2002 Sun Microsystems, Inc.
*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License Version
* 1.0 (the "License"). You may not use this file except in compliance with
* the License. A copy of the License is included as the file "license.terms",
* and also available at http://www.sun.com/
*
* The Original Code is from:
* Brazil project web application toolkit release 2.3.
* The Initial Developer of the Original Code is: suhler.
* Portions created by suhler are Copyright (C) Sun Microsystems, Inc.
* All Rights Reserved.
*
* Contributor(s): cstevens, suhler.
*
* Version: 2.1
* Created by suhler on 98/09/14
* Last modified by suhler on 02/10/01 16:36:24
*
* Version Histories:
*
* 2.1 02/10/01-16:36:24 (suhler)
* version change
*
* 1.9 01/08/14-16:38:05 (suhler)
* doc lint
*
* 1.8 00/12/11-13:27:02 (suhler)
* add class=props for automatic property extraction
*
* 1.7 00/04/20-11:48:28 (cstevens)
* copyright.
*
* 1.6 99/10/14-14:57:12 (cstevens)
* resolve wilcard imports.
*
* 1.5 99/10/01-11:26:00 (cstevens)
* Change logging to show prefix of Handler generating the log message.
*
* 1.4 99/09/15-14:39:17 (cstevens)
* Rewritign http server to make it easier to proxy requests.
*
* 1.3 99/03/30-09:30:45 (suhler)
* documentation update
*
* 1.2 98/09/21-14:54:51 (suhler)
* changed the package names
*
* 1.2 98/09/14-18:03:11 (Codemgr)
* SunPro Code Manager data about conflicts, renames, etc...
* Name history : 2 1 handlers/SupplyHandler.java
* Name history : 1 0 SupplyHandler.java
*
* 1.1 98/09/14-18:03:10 (suhler)
* date and time created 98/09/14 18:03:10 by suhler
*
*/
package sunlabs.brazil.handler;
import java.io.FileInputStream;
import java.util.Properties;
import java.util.StringTokenizer;
import sunlabs.brazil.server.Handler;
import sunlabs.brazil.server.Request;
import sunlabs.brazil.server.Server;
/**
* Sample Handler for dispatching different users to different url's
* based on a special http authentication header.
* This is a re-implementation of the supplier.net content server
* using the new server apis (e.g. its not used for anything anymore).
* This handler was originally designed to be a "virtual web site", where
* credentials are passed in from an upstream proxy. Those credentials are
* used to provide different views based on the particular credentials supplied.
*
* The following configuration properties are used:
*
* - mapFile
- properties file
*
- prefix
- url prefix
*
- default
- default map
*
- header
- http header (authentication)
*
- realm
- The authentication realm (basic)
*
*
* @author Stephen Uhler
* @version 2.1, 02/10/01
*/
public class SupplyHandler implements Handler {
private Properties map; // The authorization mapping table
private String propsPrefix; // My prefix in the global properties file
private String urlPrefix; // The prefix to look for to map
private String authHeader; // header containing auth info
private String realm; // The authentication realm
private static final String MAP = "mapFile"; // properties file
private static final String PREFIX = "prefix"; // url prefix
private static final String DEFAULT = "default"; // default map
private static final String HEADER = "header"; // http header
private static final String REALM = "realm"; // realm to look for
public boolean
init(Server server, String prefix) {
propsPrefix = prefix;
authHeader = server.props.getProperty(propsPrefix + HEADER,
"authorization");
realm = server.props.getProperty(propsPrefix + REALM, "basic");
urlPrefix = server.props.getProperty(propsPrefix + PREFIX,"");
if (urlPrefix.equals("")) {
server.log(Server.LOG_WARNING, prefix, "handler can't find " + PREFIX);
return false;
}
if (!urlPrefix.endsWith("/")) {
urlPrefix += "/";
}
String mapFile = server.props.getProperty(propsPrefix + MAP,"");
try {
FileInputStream in = new FileInputStream(mapFile);
map = new Properties();
map.load(in);
in.close();
} catch (Exception e) {
server.log(Server.LOG_ERROR, propsPrefix + MAP, ": (" + mapFile + ") " + e.toString());
return false;
}
return true;
}
/**
* Dispatch and handle the request.
* This version looks at the supplier id, rewrites the url based on
* that supplier, then lets the default handler do it.
*/
public boolean
respond(Request request) {
if (!request.url.startsWith(urlPrefix)) {
return false;
}
request.log(Server.LOG_INFORMATIONAL, propsPrefix + ".. handling request");
if (request.headers.get(authHeader) == null) {
request.sendError(404,"Not Authorized - no credentials supplied", "");
return true;
}
StringTokenizer auth = new
StringTokenizer((String) request.headers.get(authHeader));
String realm = auth.nextToken();
if (!realm.equals(realm)) {
request.sendError(404,"Not Authorized - Invalid realm",
"Realm: " + auth + " need: " + realm);
return true;
}
String src = auth.nextToken();
String dst = map.getProperty(src,
request.props.getProperty(propsPrefix + DEFAULT,""));
if (dst.equals("")) {
request.sendError(404,"Not Authorized - Invalid id :" + src, "");
return true;
}
// If we have a supplier url, change it to the correct supplier,
// based on the id of the user, otherwise handle it as a normal url.
String url = "/" + dst +
request.url.substring(request.url.indexOf("/",1));
request.log(Server.LOG_INFORMATIONAL, propsPrefix + ": mapping " + request.url +
" -> " + url);
request.url = url;
return false;
}
}