| /******************************************************************************* |
| * Copyright (c) 2002-2005 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM - Initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.wst.wsi.internal.core.util; |
| |
| import java.util.HashMap; |
| import java.util.Map; |
| import com.ibm.icu.util.StringTokenizer; |
| |
| import org.eclipse.wst.wsi.internal.core.WSIException; |
| |
| /** |
| * Set of HTTPL related utilities. |
| * |
| * @version 1.0.1 |
| * @author Peter Brittenham |
| */ |
| |
| public final class HTTPUtils |
| { |
| |
| /** |
| * Find the URL string in a HTTP POST header. |
| * @param httpPostHeader a HTTP POST header. |
| * @return the URL string in a HTTP POST header. |
| */ |
| public static String getURLString(String httpPostHeader) |
| { |
| String urlString = null; |
| int start, end; |
| |
| // If POST, then continue |
| if (httpPostHeader.startsWith("POST") || httpPostHeader.startsWith("GET")) |
| { |
| // Start after first space |
| start = httpPostHeader.indexOf(' ') + 1; |
| |
| // Look for next non-space character |
| while (httpPostHeader.charAt(start) == ' ') |
| start++; |
| |
| // Find next space character |
| end = httpPostHeader.indexOf(' ', start); |
| |
| // Get URL string which is located in between start and end |
| urlString = httpPostHeader.substring(start, end); |
| } |
| |
| // Else throw exception |
| else |
| { |
| throw new IllegalArgumentException( |
| "HTTP header does not contain POST data (was: " + httpPostHeader + ")"); |
| } |
| |
| // Return URL string |
| return urlString; |
| } |
| /** |
| * Utility to present HTTP header information as attribute-value pairs, |
| * based on ':' as attribute-value separator. |
| * @param httpHeaderString an HTTP header string. |
| * @param separators attribute-value separator list. |
| * @return HTTP header information as attribute-value pairs. |
| * @throws WSIException if unable to create HTTP header information |
| * as attribute-value pairs. |
| */ |
| public static Map getHttpHeaderTokens(String httpHeaderString, String separators) |
| throws WSIException |
| { |
| StringTokenizer tokenizer = new StringTokenizer(httpHeaderString, "\n\r\f"); |
| Map map = new HashMap(); |
| String name = null; |
| while (tokenizer.hasMoreTokens()) |
| { |
| String line = tokenizer.nextToken(); |
| int index = line.indexOf(separators); |
| if (index > 0 && index < line.length() - 1) |
| { |
| name = line.substring(0, index).toUpperCase(); |
| map.put(name, line.substring(index + 1).trim()); |
| } |
| else |
| { |
| if ((name != null) && (line.length()>0) && Character.isWhitespace(line.charAt(0))) |
| map.put(name, map.get(name) + " " + line.trim()); |
| } |
| } |
| return map; |
| } |
| |
| /** |
| * Utility to take sub attribute value from HTTP header |
| * @param httpHeaderString an HTTP header string. |
| * @param attributeName attribute name. |
| * @param subAttributeName sub attribute name. |
| * @return sub attribute value from HTTP header. |
| * @throws WSIException if unable to get sub attribute value from HTTP header. |
| */ |
| public static String getHttpHeaderSubAttribute(String httpHeaderString, |
| String attributeName, String subAttributeName) |
| throws WSIException |
| { |
| // get attribute value |
| String value = |
| (String) getHttpHeaderTokens(httpHeaderString,":").get(attributeName.toUpperCase()); |
| if(value != null) |
| { |
| // search sub attribute token |
| int idxQ = value.toUpperCase().indexOf(subAttributeName.toUpperCase()+"=\""); |
| int idx = value.toUpperCase().indexOf(subAttributeName.toUpperCase()+"="); |
| // if attribute is quoted |
| if (idxQ != -1) |
| { |
| idxQ += (subAttributeName+"=\"").length(); |
| int eIdxQ = value.indexOf("\"", idxQ); |
| if (eIdxQ != -1) |
| { |
| return value.substring(idxQ, eIdxQ); |
| } |
| else |
| { |
| return null; |
| } |
| } |
| // if attribute do not quoted |
| else if (idx != -1) |
| { |
| idx += (subAttributeName+"=").length(); |
| int eIdx = -1; |
| // find end space separator |
| if ((eIdx = value.indexOf(" ", idx)) != -1) |
| { |
| return value.substring(idx, eIdx); |
| } |
| // find coma separator |
| else if ((eIdx = value.indexOf(";", idx)) != -1) |
| { |
| return value.substring(idx, eIdx); |
| } |
| // this is last attribute |
| else |
| { |
| return value.substring(idx); |
| } |
| } |
| // if attribute do not found |
| else |
| { |
| return null; |
| } |
| } |
| return value; |
| } |
| |
| /** |
| * Utility to take attribute value from HTTP header |
| * @param httpHeaderString an HTTP header string. |
| * @param attributeName attribute name. |
| * @return attribute value from HTTP header. |
| * @throws WSIException if unable to get attribute value from HTTP header. |
| */ |
| public static String getHttpHeaderAttribute(String httpHeaderString, |
| String attributeName) |
| throws WSIException |
| { |
| String attributeValue = |
| (String) getHttpHeaderTokens(httpHeaderString,":").get(attributeName.toUpperCase()); |
| // get first token |
| if((attributeValue != null) && (attributeValue.indexOf(";") != -1)) { |
| attributeValue = attributeValue.substring(0, attributeValue.indexOf(";")); |
| } |
| return attributeValue; |
| } |
| } |