/* * ==================================================================== * ======== The Apache Software License, Version 1.1 * ================== * ========================================================== * Copyright (C) 2002 The Apache Software Foundation. All rights * reserved. Redistribution and use in source and binary forms, with * or without modifica- tion, are permitted provided that the * following conditions are met: 1. Redistributions of source code * must retain the above copyright notice, this list of conditions and * the following disclaimer. 2. Redistributions in binary form must * reproduce the above copyright notice, this list of conditions and * the following disclaimer in the documentation and/or other * materials provided with the distribution. 3. The end-user * documentation included with the redistribution, if any, must * include the following acknowledgment: "This product includes * software developed by SuperBonBon Industries * (http://www.sbbi.net/)." Alternately, this acknowledgment may * appear in the software itself, if and wherever such third-party * acknowledgments normally appear. 4. The names "UPNPLib" and * "SuperBonBon Industries" must not be used to endorse or promote * products derived from this software without prior written * permission. For written permission, please contact info@sbbi.net. * 5. Products derived from this software may not be called * "SuperBonBon Industries", nor may "SBBI" appear in their name, * without prior written permission of SuperBonBon Industries. THIS * SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- DING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. This software consists of voluntary contributions made * by many individuals on behalf of SuperBonBon Industries. For more * information on SuperBonBon Industries, please see * <http://www.sbbi.net/>. */ package net.tomp2p.upnp; import java.util.HashMap; import java.util.Map; import java.util.StringTokenizer; /** * A class to parse an HTTP response message. * * @author <a href="mailto:superbonbon@sbbi.net">SuperBonBon</a> * @version 1.0 */ class HttpResponse { private String header; private Map<String, String> fields; private String body; /** * Constructor of the response, will try to parse the raw response data * * @param rawHttpResponse * the raw response data * @throws IllegalArgumentException * if some error occurs during parsing */ protected HttpResponse(String rawHttpResponse) throws IllegalArgumentException { if (rawHttpResponse == null || rawHttpResponse.trim().length() == 0) { throw new IllegalArgumentException("Empty HTTP response message"); } boolean bodyParsing = false; StringBuilder bodyParsed = new StringBuilder(); fields = new HashMap<String, String>(); String[] lines = rawHttpResponse.split("\\r\\n"); header = lines[0].trim(); for (int i = 1; i < lines.length; i++) { String line = lines[i]; if (line.length() == 0) { // line break before body bodyParsing = true; } else if (bodyParsing) { // we parse the message body bodyParsed.append(line).append("\r\n"); } else { // we parse the header if (line.length() > 0) { int delim = line.indexOf(':'); if (delim != -1) { String key = line.substring(0, delim).toUpperCase(); String value = line.substring(delim + 1).trim(); fields.put(key, value); } else { throw new IllegalArgumentException("Invalid HTTP message header :" + line); } } } } if (bodyParsing) { body = bodyParsed.toString(); } } public String getHeader() { return header; } public String getBody() { return body; } public String getHTTPFieldElement(String fieldName, String elementName) throws IllegalArgumentException { String fieldNameValue = getHTTPHeaderField(fieldName); if (fieldName != null) { StringTokenizer tokenizer = new StringTokenizer(fieldNameValue.trim(), ","); while (tokenizer.countTokens() > 0) { String nextToken = tokenizer.nextToken().trim(); if (nextToken.startsWith(elementName)) { int index = nextToken.indexOf("="); if (index != -1) { return nextToken.substring(index + 1).trim(); } } } } throw new IllegalArgumentException("HTTP element field " + elementName + " is not present"); } public String getHTTPHeaderField(String fieldName) throws IllegalArgumentException { String field = fields.get(fieldName.toUpperCase()); if (field == null) { throw new IllegalArgumentException("HTTP field " + fieldName + " is not present"); } return field; } }