/*
* Copyright 2011 Sonian Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.sonian.elasticsearch.http.jetty;
import org.elasticsearch.http.HttpChannel;
import org.elasticsearch.rest.RestRequest;
import org.elasticsearch.rest.RestResponse;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
/**
* @author imotov
*/
public class JettyHttpServerRestChannel extends HttpChannel {
private final RestRequest restRequest;
private final HttpServletResponse resp;
private IOException sendFailure;
private final CountDownLatch latch;
public JettyHttpServerRestChannel(RestRequest restRequest, HttpServletResponse resp) {
super(restRequest);
this.restRequest = restRequest;
this.resp = resp;
this.latch = new CountDownLatch(1);
}
public void await() throws InterruptedException {
latch.await();
}
public IOException sendFailure() {
return sendFailure;
}
@Override
public void sendResponse(RestResponse response) {
resp.setContentType(response.contentType());
resp.addHeader("Access-Control-Allow-Origin", "*");
if (response.status() != null) {
resp.setStatus(response.status().getStatus());
} else {
resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
if (restRequest.method() == RestRequest.Method.OPTIONS) {
// also add more access control parameters
resp.addHeader("Access-Control-Max-Age", "1728000");
resp.addHeader("Access-Control-Allow-Methods", "OPTIONS, HEAD, GET, POST, PUT, DELETE");
resp.addHeader("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Content-Length");
}
try {
int contentLength = response.content().length();
resp.setContentLength(contentLength);
ServletOutputStream out = resp.getOutputStream();
response.content().writeTo(out);
// TODO: close in a finally?
out.close();
} catch (IOException e) {
sendFailure = e;
} finally {
latch.countDown();
}
}
}