/*
* Copyright © 2014-2016 Cask Data, 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 co.cask.cdap.api.service.http;
import com.google.gson.Gson;
import org.apache.twill.filesystem.Location;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Type;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.util.Map;
/**
* Interface with methods for sending HTTP responses.
*/
public interface HttpServiceResponder {
/**
* Sends JSON response back to the client with a default status.
*
* @param object object that will be serialized into JSON and sent back as content
*/
void sendJson(Object object);
/**
* Sends JSON response back to the client.
*
* @param status status of the HTTP response
* @param object object that will be serialized into JSON and sent back as content
*/
void sendJson(int status, Object object);
/**
* Sends JSON response back to the client using the given {@link Gson} object.
*
* @param status status of the HTTP response
* @param object the object that will be serialized into JSON and sent back as content
* @param type the type of object
* @param gson the Gson object for serialization
*/
void sendJson(int status, Object object, Type type, Gson gson);
/**
* Sends a UTF-8 encoded string response back to the HTTP client with a default response status.
*
* @param data the string data to be sent back
*/
void sendString(String data);
/**
* Sends a string response back to the HTTP client.
*
* @param status status of the HTTP response
* @param data the data to be sent back
* @param charset the Charset used to encode the string
*/
void sendString(int status, String data, Charset charset);
/**
* Sends only a status code back to client without any content.
*
* @param status status of the HTTP response
*/
void sendStatus(int status);
/**
* Sends a status code and headers back to client without any content.
*
* @param status status of the HTTP response
* @param headers headers to send
*/
void sendStatus(int status, Map<String, String> headers);
/**
* Sends a status code and headers back to client without any content.
*
* @param status status of the HTTP response
* @param headers headers to send; each {@link java.util.Map.Entry} contains the header name and value to be sent,
* allowing multiple values for the same header name
*/
void sendStatus(int status, Iterable<? extends Map.Entry<String, String>> headers);
/**
* Sends an error message back to the client with the specified status code.
*
* @param status status of the HTTP response
* @param errorMessage error message sent back to the client
*/
void sendError(int status, String errorMessage);
/**
* Sends response back to client.
*
* @param status status of the HTTP response
* @param content content to be sent back
* @param contentType type of content
* @param headers headers to be sent back
*/
void send(int status, ByteBuffer content, String contentType, Map<String, String> headers);
/**
* Sends response back to client.
*
* @param status status of the HTTP response
* @param content content to be sent back
* @param contentType type of content
* @param headers headers to send; each {@link java.util.Map.Entry} contains the header name and value to be sent,
* allowing multiple values for the same header name
*/
void send(int status, ByteBuffer content, String contentType, Iterable<? extends Map.Entry<String, String>> headers);
/**
* Sends response back to client with response body produced by the given {@link HttpContentProducer}.
*
* @param status status of the HTTP response
* @param producer a {@link HttpContentProducer} to produce content to be sent back
* @param contentType type of content
*/
void send(int status, HttpContentProducer producer, String contentType);
/**
* Sends response back to client with response body produced by the given {@link HttpContentProducer}.
*
* @param status status of the HTTP response
* @param producer a {@link HttpContentProducer} to produce content to be sent back
* @param contentType type of content
* @param headers headers to be sent back
*/
void send(int status, HttpContentProducer producer, String contentType, Map<String, String> headers);
/**
* Sends response back to client with response body produced by the given {@link HttpContentProducer}.
*
* @param status status of the HTTP response
* @param producer a {@link HttpContentProducer} to produce content to be sent back
* @param contentType type of content
* @param headers headers to send; each {@link java.util.Map.Entry} contains the header name and value to be sent,
* allowing multiple values for the same header name
*/
void send(int status, HttpContentProducer producer, String contentType,
Iterable<? extends Map.Entry<String, String>> headers);
/**
* Sends response back to client using content in the given {@link Location} as the response body.
*
* @param status status of the HTTP response
* @param location location containing the response body
* @param contentType type of content
* @throws IOException if failed to open an {@link InputStream} from the given {@link Location}.
*/
void send(int status, Location location, String contentType) throws IOException;
/**
* Sends response back to client using content in the given {@link Location} as the response body.
*
* @param status status of the HTTP response
* @param location location containing the response body
* @param contentType type of content
* @param headers headers to be sent back
* @throws IOException if failed to open an {@link InputStream} from the given {@link Location}.
*/
void send(int status, Location location, String contentType, Map<String, String> headers) throws IOException;
/**
* Sends response back to client using content in the given {@link Location} as the response body.
*
* @param status status of the HTTP response
* @param location location containing the response body
* @param contentType type of content
* @param headers headers to send; each {@link java.util.Map.Entry} contains the header name and value to be sent,
* allowing multiple values for the same header name
* @throws IOException if failed to open an {@link InputStream} from the given {@link Location}.
*/
void send(int status, Location location, String contentType,
Iterable<? extends Map.Entry<String, String>> headers) throws IOException;
}