All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.mockserver.model.HttpResponse Maven / Gradle / Ivy

package org.mockserver.model;

import com.fasterxml.jackson.annotation.JsonIgnore;

import java.nio.charset.Charset;
import java.util.*;
import java.util.concurrent.TimeUnit;

import static org.mockserver.model.Cookie.cookie;
import static org.mockserver.model.Header.header;
import static org.mockserver.model.NottableString.string;

/**
 * @author jamesdbloom
 */
public class HttpResponse extends Action {
    private Integer statusCode;
    private BodyWithContentType body;
    private Map headers = new LinkedHashMap();
    private Map cookies = new LinkedHashMap();
    private Delay delay;
    private ConnectionOptions connectionOptions;

    /**
     * Static builder to create a response.
     */
    public static HttpResponse response() {
        return new HttpResponse();
    }

    /**
     * Static builder to create a response with a 200 status code and the string response body.
     *
     * @param body a string
     */
    public static HttpResponse response(String body) {
        return new HttpResponse().withStatusCode(200).withBody(body);
    }

    /**
     * Static builder to create a not found response.
     */
    public static HttpResponse notFoundResponse() {
        return new HttpResponse().withStatusCode(404);
    }

    /**
     * The status code to return, such as 200, 404, the status code specified
     * here will result in the default status message for this status code for
     * example for 200 the status message "OK" is used
     *
     * @param statusCode an integer such as 200 or 404
     */
    public HttpResponse withStatusCode(Integer statusCode) {
        this.statusCode = statusCode;
        return this;
    }

    public Integer getStatusCode() {
        return statusCode;
    }

    /**
     * Set response body to return as a string response body. The character set will be determined by the Content-Type header
     * on the response. To force the character set, use {@link #withBody(String, Charset)}.
     *
     * @param body a string
     */
    public HttpResponse withBody(String body) {
        if (body != null) {
            this.body = new StringBody(body);
        }
        return this;
    }

    /**
     * Set response body to return a string response body with the specified encoding. Note: The character set of the
     * response will be forced to the specified charset, even if the Content-Type header specifies otherwise.
     *
     * @param body    a string
     * @param charset character set the string will be encoded in
     */
    public HttpResponse withBody(String body, Charset charset) {
        if (body != null) {
            this.body = new StringBody(body, charset);
        }
        return this;
    }


    /**
     * Set response body to return as binary such as a pdf or image
     *
     * @param body a byte array
     */
    public HttpResponse withBody(byte[] body) {
        this.body = new BinaryBody(body);
        return this;
    }

    /**
     * Set the body to return for example:
     * 

* string body: * - exact("

a simple string body
"); *

* or *

* - new StringBody("

a simple string body
") *

* binary body: * - binary(IOUtils.readFully(getClass().getClassLoader().getResourceAsStream("example.pdf"), 1024)); *

* or *

* - new BinaryBody(IOUtils.readFully(getClass().getClassLoader().getResourceAsStream("example.pdf"), 1024)); * * @param body an instance of one of the Body subclasses including StringBody or BinaryBody */ public HttpResponse withBody(BodyWithContentType body) { this.body = body; return this; } public BodyWithContentType getBody() { return body; } @JsonIgnore public String getBodyAsString() { if (body != null) { return body.toString(); } else { return null; } } /** * The headers to return as a list of Header objects * * @param headers a list of Header objects */ public HttpResponse withHeaders(List

headers) { this.headers.clear(); for (Header header : headers) { withHeader(header); } return this; } /** * The headers to return as a varargs of Header objects * * @param headers a varargs of Header objects */ public HttpResponse withHeaders(Header... headers) { if (headers != null) { withHeaders(Arrays.asList(headers)); } return this; } /** * Add a header to return as a Header object, if a header with * the same name already exists this will NOT be modified but * two headers will exist * * @param header a Header objects */ public HttpResponse withHeader(Header header) { if (this.headers.containsKey(header.getName())) { this.headers.get(header.getName()).addNottableValues(header.getValues()); } else { this.headers.put(header.getName(), header); } return this; } /** * Add a header to return as a Header object, if a header with * the same name already exists this will NOT be modified but * two headers will exist * * @param name the header name * @param values the header values which can be a varags of strings or regular expressions */ public HttpResponse withHeader(String name, String... values) { if (this.headers.containsKey(string(name))) { this.headers.get(string(name)).addValues(values); } else { this.headers.put(string(name), header(name, values)); } return this; } /** * Update header to return as a Header object, if a header with * the same name already exists it will be modified * * @param header a Header objects */ public HttpResponse updateHeader(Header header) { this.headers.put(header.getName(), header); return this; } /** * Update header to return as a Header object, if a header with * the same name already exists it will be modified * * @param name the header name * @param values the header values which can be a varags of strings or regular expressions */ public HttpResponse updateHeader(String name, String... values) { this.headers.put(string(name), header(name, values)); return this; } public List
getHeaders() { return new ArrayList
(headers.values()); } public List getHeader(String name) { List headerValues = new ArrayList(); for (NottableString headerName : headers.keySet()) { if (headerName.equalsIgnoreCase(string(name))) { for (NottableString headerValue : headers.get(headerName).getValues()) { headerValues.add(headerValue.getValue()); } } } return headerValues; } public String getFirstHeader(String name) { List headerValues = getHeader(name); if (headerValues.size() > 0) { return headerValues.get(0); } else { return ""; } } public boolean containsHeader(String name, String value) { for (NottableString headerName : headers.keySet()) { if (headerName.equalsIgnoreCase(string(name))) { for (NottableString headerValue : headers.get(headerName).getValues()) { if (headerValue.equalsIgnoreCase(value)) { return true; } } } } return false; } /** * The cookies to return as Set-Cookie headers as a list of Cookie objects * * @param cookies a list of Cookie objects */ public HttpResponse withCookies(List cookies) { this.cookies.clear(); for (Cookie cookie : cookies) { withCookie(cookie); } return this; } /** * The cookies to return as Set-Cookie headers as a varargs of Cookie objects * * @param cookies a varargs of Cookie objects */ public HttpResponse withCookies(Cookie... cookies) { if (cookies != null) { withCookies(Arrays.asList(cookies)); } return this; } /** * Add cookie to return as Set-Cookie header * * @param cookie a Cookie object */ public HttpResponse withCookie(Cookie cookie) { this.cookies.put(cookie.getName(), cookie); return this; } /** * Add cookie to return as Set-Cookie header * * @param name the cookies name * @param value the cookies value which can be a string or regular expression */ public HttpResponse withCookie(String name, String value) { this.cookies.put(string(name), cookie(name, value)); return this; } public List getCookies() { return new ArrayList(cookies.values()); } /** * The delay before responding with this request as a Delay object, for example new Delay(TimeUnit.SECONDS, 3) * * @param delay a Delay object, for example new Delay(TimeUnit.SECONDS, 3) */ public HttpResponse withDelay(Delay delay) { this.delay = delay; return this; } /** * The delay before responding with this request as a Delay object, for example new Delay(TimeUnit.SECONDS, 3) * * @param timeUnit a the time unit, for example TimeUnit.SECONDS * @param value a the number of time units to delay the response */ public HttpResponse withDelay(TimeUnit timeUnit, long value) { this.delay = new Delay(timeUnit, value); return this; } public Delay getDelay() { return delay; } /** * The connection options for override the default connection behaviour, this allows full control of headers such * as "Connection" or "Content-Length" or controlling whether the socket is closed after the response has been sent * * @param connectionOptions the connection options for override the default connection behaviour */ public HttpResponse withConnectionOptions(ConnectionOptions connectionOptions) { this.connectionOptions = connectionOptions; return this; } public ConnectionOptions getConnectionOptions() { return connectionOptions; } @JsonIgnore public HttpResponse applyDelay() { if (delay != null) { delay.applyDelay(); } return this; } @Override @JsonIgnore public Type getType() { return Type.RESPONSE; } public HttpResponse clone() { return response() .withStatusCode(getStatusCode()) .withBody(getBody()) .withHeaders(getHeaders()) .withCookies(getCookies()) .withDelay(getDelay()) .withConnectionOptions(getConnectionOptions()); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy