/* * Copyright 2008-2011 Thomas Nichols. http://blog.thomnichols.org * * Licensed 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 * * http://www.apache.org/licenses/LICENSE-2.0 * * 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. * * You are receiving this code free of charge, which represents many hours of * effort from other individuals and corporations. As a responsible member * of the community, you are encouraged (but not required) to donate any * enhancements or improvements back to the community under a similar open * source license. Thank you. -TMN */ package groovyx.net.http; import java.util.Iterator; import java.util.Locale; import org.apache.http.Header; import org.apache.http.HeaderIterator; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.ProtocolVersion; import org.apache.http.StatusLine; import org.apache.http.params.HttpParams; import org.apache.http.protocol.ExecutionContext; import org.apache.http.protocol.HttpContext; /** * This class is a wrapper for {@link HttpResponse}, which allows for * simplified header access, as well as carrying the auto-parsed response data. * (see {@link HTTPBuilder#parseResponse(HttpResponse, Object)}). * * @see HeadersDecorator * @author <a href='mailto:tomstrummer+httpbuilder@gmail.com'>Tom Nichols</a> * @since 0.5.0 */ public class HttpResponseDecorator implements HttpResponse { HeadersDecorator headers = null; HttpResponse responseBase; HttpContextDecorator context; Object responseData; public HttpResponseDecorator( HttpResponse base, Object parsedResponse ) { this( base, null, parsedResponse ); } public HttpResponseDecorator( HttpResponse base, HttpContextDecorator context, Object parsedResponse ) { this.responseBase = base; this.context = context; this.responseData = parsedResponse; } /** * Return a {@link HeadersDecorator}, which provides a more Groovy API for * accessing response headers. * @return the headers for this response */ public HeadersDecorator getHeaders() { if ( headers == null ) headers = new HeadersDecorator(); return headers; } /** * Quickly determine if the request resulted in an error code. * @return true if the response code is within the range of * {@link Status#SUCCESS} */ public boolean isSuccess() { return Status.find( getStatus() ) == Status.SUCCESS; } /** * Get the response status code. * @see StatusLine#getStatusCode() * @return the HTTP response code. */ public int getStatus() { return responseBase.getStatusLine().getStatusCode(); } /** * Get the content-type for this response. * @see ParserRegistry#getContentType(HttpResponse) * @return the content-type string, without any charset information. */ public String getContentType() { return ParserRegistry.getContentType( responseBase ); } /** * Return the parsed data from this response body. * @return the parsed response object, or <code>null</code> if the response * does not contain any data. */ public Object getData() { return this.responseData; } void setData( Object responseData ) { this.responseData = responseData; } /** * Get the execution context used during this request * @see ExecutionContext * @return the {@link HttpContext} */ public HttpContextDecorator getContext() { return this.context; } /** * This class is returned by {@link HttpResponseDecorator#getHeaders()}. * It provides three "Groovy" ways to access headers: * <dl> * <dt>Bracket notation</dt><dd><code>resp.headers['Content-Type']</code> * returns the {@link Header} instance</dd> * <dt>Property notation</dt><dd><code>resp.headers.'Content-Type'</code> * returns the {@link Header#getValue() header value}</dd> * <dt>Iterator methods</dt><dd>Iterates over each Header: * <pre>resp.headers.each { * println "${it.name} : ${it.value}" * }</pre></dd> * </dl> * @author <a href='mailto:tomstrummer+httpbuilder@gmail.com'>Tom Nichols</a> * @since 0.5.0 */ public final class HeadersDecorator implements Iterable<Header> { /** * Access the named header value, using bracket form. For example, * <code>response.headers['Content-Encoding']</code> * @see HttpResponse#getFirstHeader(String) * @param name header name, e.g. <code>Content-Type<code> * @return the {@link Header}, or <code>null</code> if it does not exist * in this response */ public Header getAt( String name ) { return responseBase.getFirstHeader( name ); } /** * Allow property-style access to header values. This is the same as * {@link #getAt(String)}, except it simply returns the header's String * value, instead of the Header object. * * @param name header name, e.g. <code>Content-Type<code> * @return the {@link Header}, or <code>null</code> if it does not exist * in this response */ protected String propertyMissing( String name ) { Header h = this.getAt( name ); return h != null ? h.getValue() : null; } /** * Used to allow Groovy iteration methods over the response headers. * For example: * <pre>response.headers.each { * println "${it.name} : ${it.value}" * }</pre> */ @SuppressWarnings("unchecked") public Iterator iterator() { return responseBase.headerIterator(); } } public HttpEntity getEntity() { return responseBase.getEntity(); } public Locale getLocale() { return responseBase.getLocale(); } public StatusLine getStatusLine() { return responseBase.getStatusLine(); } public void setEntity( HttpEntity arg0 ) { responseBase.setEntity( arg0 ); } public void setLocale( Locale arg0 ) { responseBase.setLocale( arg0 ); } public void setReasonPhrase( String arg0 ) throws IllegalStateException { responseBase.setReasonPhrase( arg0 ); } public void setStatusCode( int arg0 ) throws IllegalStateException { responseBase.setStatusCode( arg0 ); } public void setStatusLine( StatusLine arg0 ) { responseBase.setStatusLine( arg0 ); } public void setStatusLine( ProtocolVersion arg0, int arg1 ) { responseBase.setStatusLine( arg0, arg1 ); } public void setStatusLine( ProtocolVersion arg0, int arg1, String arg2 ) { responseBase.setStatusLine( arg0, arg1, arg2 ); } public void addHeader( Header arg0 ) { responseBase.addHeader( arg0 ); } public void addHeader( String arg0, String arg1 ) { responseBase.addHeader( arg0, arg1 ); } public boolean containsHeader( String arg0 ) { return responseBase.containsHeader( arg0 ); } public Header[] getAllHeaders() { return responseBase.getAllHeaders(); } public Header getFirstHeader( String arg0 ) { return responseBase.getFirstHeader( arg0 ); } public Header[] getHeaders( String arg0 ) { return responseBase.getHeaders( arg0 ); } public Header getLastHeader( String arg0 ) { return responseBase.getLastHeader( arg0 ); } public HttpParams getParams() { return responseBase.getParams(); } public ProtocolVersion getProtocolVersion() { return responseBase.getProtocolVersion(); } public HeaderIterator headerIterator() { return responseBase.headerIterator(); } public HeaderIterator headerIterator( String arg0 ) { return responseBase.headerIterator( arg0 ); } public void removeHeader( Header arg0 ) { responseBase.removeHeader( arg0 ); } public void removeHeaders( String arg0 ) { responseBase.removeHeaders( arg0 ); } public void setHeader( Header arg0 ) { responseBase.setHeader( arg0 ); } public void setHeader( String arg0, String arg1 ) { responseBase.setHeader( arg0, arg1 ); } public void setHeaders( Header[] arg0 ) { responseBase.setHeaders( arg0 ); } public void setParams( HttpParams arg0 ) { responseBase.setParams( arg0 ); } }