/*
 * Copyright 2006 Google Inc.
 * 
 * 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.
 */
package com.google.gwt.http.client;

/**
 * Wrapper which provides access to the components of an HTTP response.
 * 
 * <h3>Required Module</h3>
 * Modules that use this class should inherit
 * <code>com.google.gwt.http.HTTP</code>.
 * 
 * {@gwt.include com/google/gwt/examples/http/InheritsExample.gwt.xml}
 */
public abstract class Response {
  /**
   * Returns the value of the requested header or null if the header was not
   * specified.
   * 
   * @param header the header to query for
   * @return the value of response header
   * 
   * @throws IllegalArgumentException if the header name is empty
   * @throws NullPointerException if the header name is null
   */
  public abstract String getHeader(String header);

  /**
   * Returns an array of HTTP headers associated with this response.
   * 
   * @return array of HTTP headers; returns zero length array if there are no
   *         headers
   */
  public abstract Header[] getHeaders();

  /**
   * Returns all headers as a single string. The individual headers are
   * delimited by a CR (U+000D) LF (U+000A) pair. An individual header is
   * formatted according to <a href="http://ietf.org/rfc/rfc2616"> RFC 2616</a>.
   * 
   * @return all headers as a single string delimited by CRLF pairs
   */
  public abstract String getHeadersAsString();

  /**
   * Returns the HTTP status code that is part of this response.
   * 
   * @return the HTTP status code
   */
  public abstract int getStatusCode();

  /**
   * Returns the HTTP status message text.
   * 
   * @return the HTTP status message text
   */
  public abstract String getStatusText();

  /**
   * Returns the text associated with the response.
   * 
   * @return the response text
   */
  public abstract String getText();
}
