michael@0: /* michael@0: * ==================================================================== michael@0: * Licensed to the Apache Software Foundation (ASF) under one michael@0: * or more contributor license agreements. See the NOTICE file michael@0: * distributed with this work for additional information michael@0: * regarding copyright ownership. The ASF licenses this file michael@0: * to you under the Apache License, Version 2.0 (the michael@0: * "License"); you may not use this file except in compliance michael@0: * with the License. You may obtain a copy of the License at michael@0: * michael@0: * http://www.apache.org/licenses/LICENSE-2.0 michael@0: * michael@0: * Unless required by applicable law or agreed to in writing, michael@0: * software distributed under the License is distributed on an michael@0: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY michael@0: * KIND, either express or implied. See the License for the michael@0: * specific language governing permissions and limitations michael@0: * under the License. michael@0: * ==================================================================== michael@0: * michael@0: * This software consists of voluntary contributions made by many michael@0: * individuals on behalf of the Apache Software Foundation. For more michael@0: * information on the Apache Software Foundation, please see michael@0: * . michael@0: * michael@0: */ michael@0: michael@0: package ch.boye.httpclientandroidlib.impl.conn; michael@0: michael@0: import java.io.IOException; michael@0: michael@0: import ch.boye.httpclientandroidlib.annotation.ThreadSafe; michael@0: michael@0: import ch.boye.httpclientandroidlib.androidextra.HttpClientAndroidLog; michael@0: /* LogFactory removed by HttpClient for Android script. */ michael@0: import ch.boye.httpclientandroidlib.HttpException; michael@0: import ch.boye.httpclientandroidlib.HttpMessage; michael@0: import ch.boye.httpclientandroidlib.HttpResponseFactory; michael@0: import ch.boye.httpclientandroidlib.NoHttpResponseException; michael@0: import ch.boye.httpclientandroidlib.ProtocolException; michael@0: import ch.boye.httpclientandroidlib.StatusLine; michael@0: import ch.boye.httpclientandroidlib.conn.params.ConnConnectionPNames; michael@0: import ch.boye.httpclientandroidlib.impl.io.AbstractMessageParser; michael@0: import ch.boye.httpclientandroidlib.io.SessionInputBuffer; michael@0: import ch.boye.httpclientandroidlib.message.LineParser; michael@0: import ch.boye.httpclientandroidlib.message.ParserCursor; michael@0: import ch.boye.httpclientandroidlib.params.HttpParams; michael@0: import ch.boye.httpclientandroidlib.util.CharArrayBuffer; michael@0: michael@0: /** michael@0: * Default HTTP response parser implementation. michael@0: *

michael@0: * The following parameters can be used to customize the behavior of this michael@0: * class: michael@0: *

michael@0: * michael@0: * @since 4.0 michael@0: */ michael@0: @ThreadSafe // no public methods michael@0: public class DefaultResponseParser extends AbstractMessageParser { michael@0: michael@0: public HttpClientAndroidLog log = new HttpClientAndroidLog(getClass()); michael@0: michael@0: private final HttpResponseFactory responseFactory; michael@0: private final CharArrayBuffer lineBuf; michael@0: private final int maxGarbageLines; michael@0: michael@0: public DefaultResponseParser( michael@0: final SessionInputBuffer buffer, michael@0: final LineParser parser, michael@0: final HttpResponseFactory responseFactory, michael@0: final HttpParams params) { michael@0: super(buffer, parser, params); michael@0: if (responseFactory == null) { michael@0: throw new IllegalArgumentException michael@0: ("Response factory may not be null"); michael@0: } michael@0: this.responseFactory = responseFactory; michael@0: this.lineBuf = new CharArrayBuffer(128); michael@0: this.maxGarbageLines = params.getIntParameter( michael@0: ConnConnectionPNames.MAX_STATUS_LINE_GARBAGE, Integer.MAX_VALUE); michael@0: } michael@0: michael@0: michael@0: @Override michael@0: protected HttpMessage parseHead( michael@0: final SessionInputBuffer sessionBuffer) throws IOException, HttpException { michael@0: //read out the HTTP status string michael@0: int count = 0; michael@0: ParserCursor cursor = null; michael@0: do { michael@0: // clear the buffer michael@0: this.lineBuf.clear(); michael@0: int i = sessionBuffer.readLine(this.lineBuf); michael@0: if (i == -1 && count == 0) { michael@0: // The server just dropped connection on us michael@0: throw new NoHttpResponseException("The target server failed to respond"); michael@0: } michael@0: cursor = new ParserCursor(0, this.lineBuf.length()); michael@0: if (lineParser.hasProtocolVersion(this.lineBuf, cursor)) { michael@0: // Got one michael@0: break; michael@0: } else if (i == -1 || count >= this.maxGarbageLines) { michael@0: // Giving up michael@0: throw new ProtocolException("The server failed to respond with a " + michael@0: "valid HTTP response"); michael@0: } michael@0: if (this.log.isDebugEnabled()) { michael@0: this.log.debug("Garbage in response: " + this.lineBuf.toString()); michael@0: } michael@0: count++; michael@0: } while(true); michael@0: //create the status line from the status string michael@0: StatusLine statusline = lineParser.parseStatusLine(this.lineBuf, cursor); michael@0: return this.responseFactory.newHttpResponse(statusline, null); michael@0: } michael@0: michael@0: }