private void sendResponse(
      ChannelHandlerContext channel,
      HttpRequest request,
      String messageBody,
      HttpResponseStatus status) {

    HttpResponse response = new DefaultHttpResponse(HttpVersion.HTTP_1_1, status);

    if (messageBody != null && !messageBody.isEmpty()) {
      response.setContent(ChannelBuffers.copiedBuffer(messageBody, Constants.DEFAULT_CHARSET));
    }

    Tracker.getInstance().trackResponse(request, response);
    HttpResponder.respond(channel, request, response);
  }
 /** @return {@link InputStream} from a {@link HttpResponse} */
 InputStream getStream(HttpResponse response) {
   try {
     return response.getEntity().getContent();
   } catch (Exception e) {
     log.error("Error reading response. " + e.getMessage());
     throw new CouchDbException(e);
   }
 }
 /**
  * Validates a HTTP response; on error cases logs status and throws relevant exceptions.
  *
  * @param response The HTTP response.
  */
 private void validate(HttpResponse response) throws IOException {
   int code = response.getStatusLine().getStatusCode();
   if (code == 200 || code == 201 || code == 202) { // success (ok | created | accepted)
     return;
   }
   String msg = format("<< Status: %s (%s) ", code, response.getStatusLine().getReasonPhrase());
   switch (code) {
     case HttpStatus.SC_NOT_FOUND:
       {
         log.info(msg);
         throw new NoDocumentException(msg);
       }
     case HttpStatus.SC_CONFLICT:
       {
         log.warn(msg);
         throw new DocumentConflictException(msg);
       }
     default:
       { // other errors: 400 | 401 | 500 etc.
         log.error(msg += EntityUtils.toString(response.getEntity()));
         throw new CouchDbException(msg);
       }
   }
 }