/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * <p/> * http://www.apache.org/licenses/LICENSE-2.0 * <p/> * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.hadoop.gateway.util; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.StringTokenizer; public class HttpUtils { public static Map<String,String[]> parseQueryString( String queryString ) { Map<String,String[]> map = new HashMap<String,String[]>(); if( queryString != null && !queryString.isEmpty() ) { StringTokenizer parser = new StringTokenizer( queryString, "&?;=", true ); String name = null; String value = null; while( parser.hasMoreTokens() ) { String token = parser.nextToken(); String ttoken = token.trim(); if( ttoken.length() == 1 ) { char c = ttoken.charAt( 0 ); switch( c ) { case '&': case '?': case ';': addQueryStringParam( map, name, value ); name = null; value = null; continue; case '=': if( name == null ) { name = ""; value = ""; } else if( name.isEmpty() ) { addQueryStringParam( map, name, value ); name = ""; value = ""; } else { value = ""; } continue; } } if( name == null ) { name = token; } else { value = token; } } // while if( name != null ) { addQueryStringParam( map, name, value ); } } return map; } private static final String urlDecodeUtf8( String s ) { if( s != null ) { try { s = URLDecoder.decode( s, "UTF-8" ); } catch( UnsupportedEncodingException e ) { // Ignore it. } } return s; } static final void addQueryStringParam( final Map<String,String[]> map, String name, String value ) { name = urlDecodeUtf8( name ); value = urlDecodeUtf8( value ); String[] values = map.get( name ); if( values == null ) { values = new String[]{ value }; } else { values = Arrays.copyOf( values, values.length + 1 ); values[ values.length-1 ] = value; } map.put( name, values ); } }