Package nginx.clojure.java

Source Code of nginx.clojure.java.NginxJavaHandler

/**
*  Copyright (C) Zhang,Yuexiang (xfeep)
*
*/
package nginx.clojure.java;

import static nginx.clojure.MiniConstants.BODY;
import static nginx.clojure.MiniConstants.NGX_HTTP_NOT_FOUND;
import static nginx.clojure.java.Constants.ASYNC_TAG;

import java.io.Closeable;

import nginx.clojure.NginxClojureRT;
import nginx.clojure.NginxHttpServerChannel;
import nginx.clojure.NginxRequest;
import nginx.clojure.NginxResponse;
import nginx.clojure.NginxSimpleHandler;

public class NginxJavaHandler extends NginxSimpleHandler {

  protected NginxJavaRingHandler ringHandler;
 
  public static Object[] NOT_FOUND_RESPONSE = new Object[] {NGX_HTTP_NOT_FOUND, null, null};
 
  public NginxJavaHandler() {
  }
 
 
  public NginxJavaHandler(NginxJavaRingHandler ringHandler) {
    super();
    this.ringHandler = ringHandler;
  }


  @Override
  public NginxRequest makeRequest(long r) {
    if (r == 0) {
      return new NginxJavaRequest(this, ringHandler, r, new Object[0]);
    }
    return new NginxJavaRequest(this, ringHandler, r);
  }
 
  @Override
  public NginxResponse process(NginxRequest req) {
    NginxJavaRequest r = (NginxJavaRequest)req;
    try{
      Object resp = ringHandler.invoke(r);
      return req.isHijacked() ? toNginxResponse(req, ASYNC_TAG) : toNginxResponse(req, resp);
    }finally {
      int bodyIdx = r.index(BODY);
      if (bodyIdx > 0) {
        try {
          Object body = r.val(bodyIdx);
          if (body != null && body instanceof Closeable) {
            ((Closeable)body).close();
          }
        } catch (Throwable e) {
          NginxClojureRT.log.error("can not close Closeable object such as FileInputStream!", e);
        }
      }
    }
  }

  @Override
  public  NginxResponse toNginxResponse(NginxRequest req, Object resp) {
   
    if (resp == null) {
      return new NginxJavaResponse(req, NOT_FOUND_RESPONSE);
    }
   
    if (resp instanceof NginxResponse) {
      return (NginxResponse)resp;
    }
    return new NginxJavaResponse(req, (Object[])resp);
  }
 
  @Override
  public void completeAsyncResponse(NginxRequest req, Object resp) {
    NginxClojureRT.completeAsyncResponse(req, toNginxResponse(req, resp));
  }


  @Override
  public NginxHttpServerChannel hijack(NginxRequest req, boolean ignoreFilter) {
    ((NginxJavaRequest)req).hijacked = true;
    return ((NginxJavaRequest)req).channel = new NginxHttpServerChannel(req, ignoreFilter);
  }

}
TOP

Related Classes of nginx.clojure.java.NginxJavaHandler

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.