/*
* Licensed to Elasticsearch under one or more contributor
* license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Elasticsearch licenses this file to you 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 org.elasticsearch.test.rest.client;
import org.elasticsearch.test.rest.Stash;
import org.elasticsearch.test.rest.client.http.HttpResponse;
import org.elasticsearch.test.rest.json.JsonPath;
import java.io.IOException;
/**
* Response obtained from a REST call
* Supports parsing the response body as json when needed and returning specific values extracted from it
*/
public class RestResponse {
private final HttpResponse response;
private JsonPath parsedResponse;
public RestResponse(HttpResponse response) {
this.response = response;
}
public int getStatusCode() {
return response.getStatusCode();
}
public String getReasonPhrase() {
return response.getReasonPhrase();
}
/**
* Returns the body properly parsed depending on the content type.
* Might be a string or a json object parsed as a map.
*/
public Object getBody() throws IOException {
if (isJson()) {
return parsedResponse().evaluate("");
}
return response.getBody();
}
/**
* Returns the body as a string
*/
public String getBodyAsString() {
return response.getBody();
}
public boolean isError() {
return response.isError();
}
/**
* Parses the response body as json and extracts a specific value from it (identified by the provided path)
*/
public Object evaluate(String path) throws IOException {
return evaluate(path, Stash.EMPTY);
}
/**
* Parses the response body as json and extracts a specific value from it (identified by the provided path)
*/
public Object evaluate(String path, Stash stash) throws IOException {
if (response == null) {
return null;
}
JsonPath jsonPath = parsedResponse();
if (jsonPath == null) {
//special case: api that don't support body (e.g. exists) return true if 200, false if 404, even if no body
//is_true: '' means the response had no body but the client returned true (caused by 200)
//is_false: '' means the response had no body but the client returned false (caused by 404)
if ("".equals(path) && !response.supportsBody()) {
return !response.isError();
}
return null;
}
return jsonPath.evaluate(path, stash);
}
private boolean isJson() {
String contentType = response.getHeaders().get("Content-Type");
return contentType != null && contentType.contains("application/json");
}
private JsonPath parsedResponse() throws IOException {
if (parsedResponse != null) {
return parsedResponse;
}
if (response == null || !response.hasBody()) {
return null;
}
return parsedResponse = new JsonPath(response.getBody());
}
}