package org.couchbase.mock.http.capi;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import org.apache.http.*;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.protocol.HttpContext;
import org.apache.http.protocol.HttpRequestHandler;
import org.apache.http.util.EntityUtils;
import org.couchbase.mock.Bucket;
import org.couchbase.mock.JsonUtils;
import org.couchbase.mock.httpio.HandlerUtil;
import org.couchbase.mock.memcached.Item;
import org.couchbase.mock.memcached.Storage;
import org.couchbase.mock.views.Configuration;
import org.couchbase.mock.views.QueryExecutionException;
import org.couchbase.mock.views.View;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
public class ViewHandler implements HttpRequestHandler {
final View view;
final Bucket bucket;
public ViewHandler(View view, Bucket bucket) {
this.view = view;
this.bucket = bucket;
}
@Override
public void handle(HttpRequest request, HttpResponse response, HttpContext context) throws HttpException, IOException {
Iterable<Item> items = bucket.getMasterItems(Storage.StorageType.CACHE);
URL url = HandlerUtil.getUrl(request);
Map<String,String> paramsMap = new HashMap<String, String>();
if (request.getRequestLine().getMethod().equals("POST")) {
HttpEntity reqEntity = ((HttpEntityEnclosingRequest)request).getEntity();
String contentType = reqEntity.getContentType().getValue();
String rawPayload = EntityUtils.toString(reqEntity);
if (!contentType.equals(ContentType.APPLICATION_JSON.getMimeType())) {
HandlerUtil.makeJsonResponse(response, "Content type must be application/json");
response.setStatusCode(HttpStatus.SC_BAD_REQUEST);
return;
}
JsonObject jsonDecoded = JsonUtils.decode(rawPayload, JsonObject.class);
for (Map.Entry<String,JsonElement> entry : jsonDecoded.entrySet()) {
paramsMap.put(entry.getKey(), entry.getValue().toString());
}
}
String queryString = url.getQuery();
if (queryString != null && !queryString.isEmpty()) {
try {
Map<String, String> kvParams = HandlerUtil.getQueryParams(queryString);
paramsMap.putAll(kvParams);
} catch (MalformedURLException ex) {
String errMessage = ex.getMessage();
if (errMessage == null) {
errMessage = "Internal Error for " + queryString;
}
HandlerUtil.makeJsonResponse(response, errMessage);
response.setStatusCode(HttpStatus.SC_BAD_REQUEST);
return;
}
}
try {
String s = view.executeRaw(items, new Configuration(paramsMap));
HandlerUtil.makeJsonResponse(response, s);
response.setStatusCode(HttpStatus.SC_OK);
StringEntity entity = (StringEntity)response.getEntity();
entity.setChunked(true);
} catch (QueryExecutionException ex) {
HandlerUtil.makeJsonResponse(response, ex.getJsonString());
response.setStatusCode(HttpStatus.SC_BAD_REQUEST);
}
}
}