
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-

#ifndef __gnu_java_net_protocol_http_Response__
#define __gnu_java_net_protocol_http_Response__

#pragma interface

#include <java/lang/Object.h>
extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace net
      {
        namespace protocol
        {
          namespace http
          {
              class Headers;
              class Response;
          }
        }
      }
    }
  }
}

class gnu::java::net::protocol::http::Response : public ::java::lang::Object
{

public: // actually protected
  Response(jint, jint, jint, ::java::lang::String *, ::gnu::java::net::protocol::http::Headers *, ::java::io::InputStream *);
public:
  virtual jint getMajorVersion();
  virtual jint getMinorVersion();
  virtual jint getCode();
  virtual jint getCodeClass();
  virtual ::java::lang::String * getMessage();
  virtual ::gnu::java::net::protocol::http::Headers * getHeaders();
  virtual ::java::lang::String * getHeader(::java::lang::String *);
  virtual jint getIntHeader(::java::lang::String *);
  virtual jlong getLongHeader(::java::lang::String *);
  virtual ::java::util::Date * getDateHeader(::java::lang::String *);
  virtual jboolean isRedirect();
  virtual jboolean isError();
  virtual ::java::io::InputStream * getBody();
public: // actually protected
  jint __attribute__((aligned(__alignof__( ::java::lang::Object)))) majorVersion;
  jint minorVersion;
  jint code;
  ::java::lang::String * message;
  ::gnu::java::net::protocol::http::Headers * headers;
  ::java::io::InputStream * body;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_java_net_protocol_http_Response__
