/** * Copyright (C) 2013 the original author or authors. * * 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 org.doctester.testbrowser; import java.io.File; import java.net.URI; import java.util.Map; import com.google.common.collect.Maps; import java.io.IOException; import org.slf4j.LoggerFactory; /** * This represents a Request we can pass then to the TestBrowser. * * @author Raphael A. Bauer * */ public class Request { private final org.slf4j.Logger logger = LoggerFactory.getLogger(Response.class); public String httpRequestType; public URI uri; public Map<String, File> filesToUpload; public Map<String, String> headers; public Map<String, String> formParameters; public Object payload; public boolean followRedirects; /** * I am private. Please use GET(), POST() and so on to get an instance of * this class. */ private Request() { filesToUpload = null; headers = Maps.newHashMap(); formParameters = null; followRedirects = true; } /** * * Get a request to perform a Http HEAD request via the TestBrowser. * * @return A request configured for a Http HEAD request. * */ public static Request HEAD() { Request httpRequest = new Request(); httpRequest.httpRequestType = HttpConstants.HEAD; return httpRequest; } /** * * Get a request to perform a Http GET request via the TestBrowser. * * @return A request configured for a Http GET request. * */ public static Request GET() { Request httpRequest = new Request(); httpRequest.httpRequestType = HttpConstants.GET; return httpRequest; } /** * * Get a request to perform a Http POST request via the TestBrowser. * * @return A request configured for a Http POST request. * */ public static Request POST() { Request httpRequest = new Request(); httpRequest.httpRequestType = HttpConstants.POST; return httpRequest; } /** * * Get a request to perform a Http PUT request via the TestBrowser. * * @return A request configured for a Http PUT request. * */ public static Request PUT() { Request httpRequest = new Request(); httpRequest.httpRequestType = HttpConstants.PUT; return httpRequest; } /** * * Get a request to perform a Http PATCH request via the TestBrowser. * * @return A request configured for a Http PATCH request. * */ public static Request PATCH() { Request httpRequest = new Request(); httpRequest.httpRequestType = HttpConstants.PATCH; return httpRequest; } /** * * Get a request to perform a Http DELETE request via the TestBrowser. * * @return A request configured for a DELETE request. * */ public static Request DELETE() { Request httpRequest = new Request(); httpRequest.httpRequestType = HttpConstants.DELETE; return httpRequest; } /** * * Set the Content-Type header to application/json; charset=utf-8. * * @return This request for joining. * */ public Request contentTypeApplicationJson() { addHeader( HttpConstants.HEADER_CONTENT_TYPE, HttpConstants.APPLICATION_JSON_WITH_CHARSET_UTF8); return this; } /** * * Set the Content-Type header to application/xml; charset=utf-8. * * @return This request for joining. * */ public Request contentTypeApplicationXml() { addHeader( HttpConstants.HEADER_CONTENT_TYPE, HttpConstants.APPLICATION_XML_WITH_CHARSET_UTF_8); return this; } /** * * Set the Uri of this request. Usually you may want to use testServerUrl() * from you Doctest and call toUri() at the end... * * @param uri The Uri of this request. * @return This Request for chaining. */ public Request url(Url url) { this.uri = url.uri(); return this; } /** * * Set the Uri of this request. Usually you may want to use testServerUrl() * from you Doctest and call toUri() at the end... * * @param uri The Uri of this request. * @return This Request for chaining. */ public Request url(URI uri) { this.uri = uri; return this; } /** * * Add a file to be sent as multipart form post/put. Only makes sense for * POST and PUT Http requests. * * @param param The parameter for this file. * @param fileToUpload The file to upload * @return This request for chaining. */ public Request addFileToUpload(String param, File fileToUpload) { if (filesToUpload == null) { filesToUpload = Maps.newHashMap(); } filesToUpload.put(param, fileToUpload); return this; } /** * * Add an arbitrary header to this request. * * @param key The header key. * @param value The header value. * @return This request for chaining. */ public Request addHeader(String key, String value) { if (headers == null) { headers = Maps.newHashMap(); } headers.put(key, value); return this; } /** * Set headers for this request. This will wipe out all previously set * headers. * * @param headers A map of header keys and header values to use. * @return This request for chaining. */ public Request headers(Map<String, String> headers) { this.headers = headers; return this; } /** * * Add an arbitrary form parameter to this request. Only makes sense for * POST or PUT requests. * * @param key The header key. * @param value The header value. * @return This request for chaining. */ public Request addFormParameter(String key, String value) { if (formParameters == null) { formParameters = Maps.newHashMap(); } formParameters.put(key, value); return this; } /** * Set form parameters for this request. Only makes sense for POST or PUT * requests. Wipes out all previously set formParameters. * * @param formParameters Map of formParemter keys and values to use. * @return This request for chaining. */ public Request formParameters(Map<String, String> formParameters) { this.formParameters = formParameters; return this; } /** * Set the payload for this request. String will be just sent as strings. If * you set Content-Type json or xml this Object will converted into the * appropriate representation. * * Calling this method multiple times will overwrite the payload. * * @param payload The payload to use. * @return This request for chaining. */ public Request payload(Object payload) { this.payload = payload; return this; } /** * Follow redirects automatically. Or simply do only one request and stop * then. * * @param followRedirects Whether to follow redirects or no. * @return This request for chaining. */ public Request followRedirects(boolean followRedirects) { this.followRedirects = followRedirects; return this; } /** * * @return The payload of this request as String. It tries to determine the * content and format the content in a pretty way. Currently works for json and xml; * */ public String payloadAsPrettyString() { try { return PayloadUtils.prettyPrintRequestPayload(payload, headers); } catch (IOException ex) { logger.error("Something went wrong when pretty printing request payload: " + ex.toString()); return "Error pretty printing the payload: \n" + ex.toString(); } } }