openesb-components/ojc-core/httpsoapbc/httpsoapbcimpl/src/com/sun/jbi/httpsoapbc/embedded/BCCoyoteRequest.java

346 lines
10 KiB
Java
Executable File

/*
* BEGIN_HEADER - DO NOT EDIT
*
* The contents of this file are subject to the terms
* of the Common Development and Distribution License
* (the "License"). You may not use this file except
* in compliance with the License.
*
* You can obtain a copy of the license at
* https://open-jbi-components.dev.java.net/public/CDDLv1.0.html.
* See the License for the specific language governing
* permissions and limitations under the License.
*
* When distributing Covered Code, include this CDDL
* HEADER in each file and include the License file at
* https://open-jbi-components.dev.java.net/public/CDDLv1.0.html.
* If applicable add the following below this CDDL HEADER,
* with the fields enclosed by brackets "[]" replaced with
* your own identifying information: Portions Copyright
* [year] [name of copyright owner]
*/
/*
* @(#)BCCoyoteRequest.java
*
* Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved.
*
* END_HEADER - DO NOT EDIT
*/
package com.sun.jbi.httpsoapbc.embedded;
import com.sun.jbi.internationalization.Messages;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.logging.Logger;
import java.util.logging.Level;
import javax.servlet.ServletRequest;
import javax.servlet.http.Cookie;
import org.apache.catalina.Context;
import org.apache.catalina.Globals;
import org.apache.coyote.tomcat5.CoyoteRequest;
import org.apache.coyote.tomcat5.CoyoteResponse;
import org.apache.coyote.tomcat5.CoyoteConnector;
import org.apache.coyote.tomcat5.CoyoteInputStream;
import org.apache.coyote.tomcat5.CoyoteReader;
import org.apache.coyote.tomcat5.InputBuffer;
import org.apache.tomcat.util.http.Parameters;
import com.sun.enterprise.web.PwcWebModule;
import com.sun.enterprise.web.session.SessionCookieConfig;
/**
* Customized version of the Tomcat 5 CoyoteRequest
* This is required for supporting Web Programmatic Login and setting the
* request encoding (charset).
*
*/
public class BCCoyoteRequest extends CoyoteRequest {
private static final Messages mMessages =
Messages.getMessages(BCCoyoteRequest.class);
//private static Logger logger = LogDomains.getLogger(LogDomains.PWC_LOGGER);
private final static Logger logger =
Messages.getLogger(BCCoyoteRequest.class);
private boolean requestEncodingSet = false;
// START SJSAS 6346738
private byte[] formData = null;
private int formDataLen = 0;
// END SJSAS 6346738
public void setContext(Context ctx) {
super.setContext(ctx);
CoyoteResponse response = (CoyoteResponse) getResponse();
// Assert response!=null
if (response != null) {
String[] cacheControls = ((PwcWebModule) ctx).getCacheControls();
for (int i=0; cacheControls!=null && i<cacheControls.length; i++) {
response.addHeader("Cache-Control", cacheControls[i]);
}
}
requestEncodingSet = false;
}
public BufferedReader getReader() throws IOException {
setRequestEncoding();
return super.getReader();
}
/**
* Return the character encoding for this Request.
*
* If there is no request charset specified in the request, determines and
* sets the request charset using the locale-charset-info,
* locale-charset-map, and parameter-encoding elements provided in the
* sun-web.xml.
*/
public String getCharacterEncoding() {
String enc = super.getCharacterEncoding();
if (enc != null) {
return enc;
}
setRequestEncoding();
return super.getCharacterEncoding();
}
/*
* Configures the given JSESSIONID cookie with the cookie-properties from
* sun-web.xml.
*
* @param cookie The JSESSIONID cookie to be configured
*/
public void configureSessionCookie(Cookie cookie) {
super.configureSessionCookie(cookie);
PwcWebModule wm = (PwcWebModule) getContext();
SessionCookieConfig cookieConfig = wm.getSessionCookieConfig();
if (cookieConfig != null) {
String name = cookieConfig.getName();
if (name != null && !name.equals(Globals.SESSION_COOKIE_NAME)) {
logger.log(Level.WARNING,
"HTTPBC-W00619.Illegal_cookie_name",
new String[] { name, Globals.SESSION_COOKIE_NAME });
}
if (cookieConfig.getPath() != null) {
cookie.setPath(cookieConfig.getPath());
}
cookie.setMaxAge(cookieConfig.getMaxAge());
if (cookieConfig.getDomain() != null) {
cookie.setDomain(cookieConfig.getDomain());
}
if (cookieConfig.getComment() != null) {
cookie.setVersion(1);
cookie.setComment(cookieConfig.getComment());
}
}
}
// START SJSAS 6346738
public void recycle() {
super.recycle();
formDataLen = 0;
}
// END SJSAS 6346738
/**
* If there is no request charset specified in the request, determines and
* sets the request charset using the locale-charset-info,
* locale-charset-map, and parameter-encoding elements provided in the
* sun-web.xml.
*/
private void setRequestEncoding() {
if (requestEncodingSet) {
return;
}
requestEncodingSet = true;
if (super.getCharacterEncoding() != null) {
return;
}
PwcWebModule wm = (PwcWebModule) getContext();
String encoding = getFormHintFieldEncoding(wm);
if (encoding == null) {
encoding = wm.getDefaultCharset();
if (encoding == null && wm.hasLocaleToCharsetMapping()) {
encoding = wm.mapLocalesToCharset(getLocales());
}
}
if (encoding != null) {
try {
setCharacterEncoding(encoding);
} catch (UnsupportedEncodingException uee) {
if (logger.isLoggable(Level.WARNING)) {
String text = mMessages.getString("HTTPBC-W00611.Unsupported_character_encoding", new Object[] { encoding, uee.getLocalizedMessage() } );
logger.log(Level.WARNING, "text", uee);
}
}
}
}
/*
* Returns the value of the query parameter whose name
* corresponds to the value of the form-hint-field attribute of the
* <parameter-encoding> element in sun-web.xml.
*
* @return The value of the query parameter whose name corresponds to the
* value of the form-hint-field attribute in sun-web.xml, or null if the
* request does not have any query string, or the query string does not
* contain a query parameter with that name
*/
private String getFormHintFieldEncoding(PwcWebModule wm) {
String encoding = null;
String formHintField = wm.getFormHintField();
if (formHintField == null){
return null;
}
if ("POST".equalsIgnoreCase(getMethod())) {
// POST
encoding = getPostDataEncoding(formHintField);
} else {
String query = getQueryString();
if (query != null) {
encoding = parseFormHintField(query, formHintField);
}
}
return encoding;
}
private String getPostDataEncoding(String formHintField) {
if (!getMethod().equalsIgnoreCase("POST")) {
return null;
}
String contentType = getContentType();
if (contentType == null)
contentType = "";
int semicolon = contentType.indexOf(';');
if (semicolon >= 0) {
contentType = contentType.substring(0, semicolon).trim();
} else {
contentType = contentType.trim();
}
if (!("application/x-www-form-urlencoded".equals(contentType))) {
return null;
}
int len = getContentLength();
if (len <= 0) {
return null;
}
int maxPostSize = ((CoyoteConnector) connector).getMaxPostSize();
if ((maxPostSize > 0) && (len > maxPostSize)) {
if (logger.isLoggable(Level.WARNING)) {
logger.log(Level.WARNING, "HTTPBC-W00610.Post_size_too_large",
new Object[] { Integer.valueOf(len), Integer.valueOf(maxPostSize) });
}
throw new IllegalStateException("Post too large");
}
String encoding = null;
try {
formData = null;
if (len < CACHED_POST_LEN) {
if (postData == null)
postData = new byte[CACHED_POST_LEN];
formData = postData;
} else {
formData = new byte[len];
}
int actualLen = readPostBody(formData, len);
if (actualLen == len) {
// START SJSAS 6346738
formDataLen = actualLen;
// END SJSAS 6346738
String formDataString = new String(formData).substring(0, len);
encoding = parseFormHintField(formDataString, formHintField);
}
} catch (Throwable t) {
; // Ignore
}
return encoding;
}
/*
* Parses the value of the specified form-hint-field from the given
* parameter string.
*
* @param paramsString Parameter string
* @param formHintField From-hint-field
*
* @return Value of form-hint-field, or null if not found
*/
private String parseFormHintField(String paramsString,
String formHintField) {
String encoding = null;
formHintField += "=";
int index = paramsString.indexOf(formHintField);
if (index != -1) {
int endIndex = paramsString.indexOf('&', index);
if (endIndex != -1) {
encoding = paramsString.substring(
index + formHintField.length(), endIndex);
} else {
encoding = paramsString.substring(
index + formHintField.length());
}
}
return encoding;
}
// START SJSAS 6346738
/**
* Gets the POST body of this request.
*
* @return The POST body of this request
*/
protected byte[] getPostBody() throws IOException {
if (formDataLen > 0) {
// POST body already read
return formData;
} else {
return super.getPostBody();
}
}
// END SJSAS 6346738
}