package com.ctriposs.baiji.rpc.server;
import com.ctriposs.baiji.exception.BaijiRuntimeException;
import org.apache.http.HttpStatus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Enumeration;
import java.util.HashMap;
/**
* Created by yqdong on 2014/9/15.
*/
public abstract class BaijiServletBase extends HttpServlet {
protected static final Logger _logger = LoggerFactory.getLogger(BaijiServlet.class);
private final BaijiServletContext _context = BaijiServletContext.INSTANCE;
private HttpRequestRouter _router;
@Override
public void init() {
_router = _context.getRequestRouter();
}
protected void processRequest(ServletRequest req, ServletResponse resp)
throws ServletException, IOException {
if (_router == null) {
((HttpServletResponse) resp).sendError(HttpStatus.SC_SERVICE_UNAVAILABLE,
"No service processor is configured.");
return;
}
if (!(req instanceof HttpServletRequest && resp instanceof HttpServletResponse)) {
throw new ServletException("non-HTTP request or response");
}
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
RequestContext requestContext = createRequestContext(request);
HttpResponseWrapper responseWrapper = createResponseWrapper(response);
_router.process(requestContext, responseWrapper);
}
private RequestContext createRequestContext(HttpServletRequest request) throws IOException {
RequestContext environment = new RequestContext();
environment.RequestBody = request.getInputStream();
if (request.getHeaderNames() != null) {
environment.RequestHeaders = new HashMap<String, String>();
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
environment.RequestHeaders.put(headerName, request.getHeader(headerName));
}
}
environment.RequestMethod = request.getMethod();
URI uri;
try {
uri = new URI(request.getRequestURL().toString());
} catch (URISyntaxException e) {
throw new BaijiRuntimeException(e);
}
environment.RequestPath = request.getPathInfo();
environment.RequestProtocol = request.getProtocol();
environment.RequestQueryString = request.getQueryString();
environment.RequestScheme = uri.getScheme();
return environment;
}
private HttpResponseWrapper createResponseWrapper(HttpServletResponse response) {
return new HttpServletResponseWrapper(response);
}
}