@Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    AtmosphereResponse that = (AtmosphereResponse) o;

    if (contentLength != that.contentLength) return false;
    if (delegateToNativeResponse != that.delegateToNativeResponse) return false;
    if (destroyable != that.destroyable) return false;
    if (headerHandled != that.headerHandled) return false;
    if (isCommited != that.isCommited) return false;
    if (status != that.status) return false;
    if (asyncIOWriter != null
        ? !asyncIOWriter.equals(that.asyncIOWriter)
        : that.asyncIOWriter != null) return false;
    if (atmosphereRequest != null
        ? !atmosphereRequest.equals(that.atmosphereRequest)
        : that.atmosphereRequest != null) return false;
    if (charSet != null ? !charSet.equals(that.charSet) : that.charSet != null) return false;
    if (contentType != null ? !contentType.equals(that.contentType) : that.contentType != null)
      return false;
    if (cookies != null ? !cookies.equals(that.cookies) : that.cookies != null) return false;
    if (headers != null ? !headers.equals(that.headers) : that.headers != null) return false;
    if (locale != null ? !locale.equals(that.locale) : that.locale != null) return false;
    if (response != null ? !response.equals(that.response) : that.response != null) return false;
    if (statusMessage != null
        ? !statusMessage.equals(that.statusMessage)
        : that.statusMessage != null) return false;
    if (writeStatusAndHeader != null
        ? !writeStatusAndHeader.equals(that.writeStatusAndHeader)
        : that.writeStatusAndHeader != null) return false;

    return true;
  }
  /** {@inheritDoc} */
  @Override
  public void sendRedirect(String location) throws IOException {
    if (!delegateToNativeResponse || forceAsyncIOWriter) {

      // Prevent StackOverflow
      boolean b = forceAsyncIOWriter;
      forceAsyncIOWriter = false;
      asyncIOWriter.redirect(this, location);
      forceAsyncIOWriter = b;
    } else {
      _r().sendRedirect(location);
    }
  }
 /** {@inheritDoc} */
 @Override
 public void sendError(int sc) throws IOException {
   if (!delegateToNativeResponse || forceAsyncIOWriter) {
     setStatus(sc);
     // Prevent StackOverflow
     boolean b = forceAsyncIOWriter;
     forceAsyncIOWriter = false;
     asyncIOWriter.writeError(this, sc, "");
     forceAsyncIOWriter = b;
   } else {
     if (!_r().isCommitted()) {
       _r().sendError(sc);
     } else {
       logger.warn("Committed error code {}", sc);
     }
   }
 }
 @Override
 public int hashCode() {
   int result = cookies != null ? cookies.hashCode() : 0;
   result = 31 * result + (headers != null ? headers.hashCode() : 0);
   result = 31 * result + (asyncIOWriter != null ? asyncIOWriter.hashCode() : 0);
   result = 31 * result + status;
   result = 31 * result + (statusMessage != null ? statusMessage.hashCode() : 0);
   result = 31 * result + (charSet != null ? charSet.hashCode() : 0);
   result = 31 * result + (int) (contentLength ^ (contentLength >>> 32));
   result = 31 * result + (contentType != null ? contentType.hashCode() : 0);
   result = 31 * result + (isCommited ? 1 : 0);
   result = 31 * result + (locale != null ? locale.hashCode() : 0);
   result = 31 * result + (headerHandled ? 1 : 0);
   result = 31 * result + (atmosphereRequest != null ? atmosphereRequest.hashCode() : 0);
   result = 31 * result + (writeStatusAndHeader != null ? writeStatusAndHeader.hashCode() : 0);
   result = 31 * result + (delegateToNativeResponse ? 1 : 0);
   result = 31 * result + (destroyable ? 1 : 0);
   result = 31 * result + (response != null ? response.hashCode() : 0);
   return result;
 }
 /**
  * Close the associated {@link AsyncIOWriter}
  *
  * @throws IOException
  */
 public void close() throws IOException {
   if (asyncIOWriter != null) {
     asyncIOWriter.close(this);
   }
 }
 private void writeStatusAndHeaders() throws java.io.IOException {
   if (writeStatusAndHeader.getAndSet(false) && !forceAsyncIOWriter) {
     asyncIOWriter.write(this, constructStatusAndHeaders());
   }
 }