Include cookies in request snippets

Closes gh-336
See gh-302, gh-303, gh-304
This commit is contained in:
Tomasz Kopczynski
2016-12-18 15:43:58 +01:00
committed by Andy Wilkinson
parent 0337160e80
commit 25bc6c37da
18 changed files with 271 additions and 11 deletions

View File

@@ -25,6 +25,8 @@ import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.servlet.http.Cookie;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.restdocs.operation.OperationRequest;
@@ -125,6 +127,11 @@ final class CliOperationRequest implements OperationRequest {
return this.delegate.getUri();
}
@Override
public Collection<Cookie> getCookies() {
return this.delegate.getCookies();
}
private interface HeaderFilter {
boolean allow(String name, List<String> value);

View File

@@ -23,6 +23,8 @@ import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.http.Cookie;
import org.springframework.http.HttpMethod;
import org.springframework.restdocs.operation.Operation;
import org.springframework.restdocs.operation.OperationRequest;
@@ -92,12 +94,28 @@ public class CurlRequestSnippet extends TemplatedSnippet {
writeUserOptionIfNecessary(request, printer);
writeHttpMethodIfNecessary(request, printer);
writeHeaders(request, printer);
writeCookies(request, printer);
writePartsIfNecessary(request, printer);
writeContent(request, printer);
return command.toString();
}
private void writeCookies(CliOperationRequest request, PrintWriter printer) {
if (request.getCookies() != null && request.getCookies().size() > 0) {
printer.print(" --cookie ");
StringBuilder cookiesBuilder = new StringBuilder();
for (Cookie cookie : request.getCookies()) {
cookiesBuilder.append(String.format("%s=%s;", cookie.getName(), cookie.getValue()));
}
String cookiesHeader = cookiesBuilder.substring(0, cookiesBuilder.length() - 1); // remove trailing semicolon
printer.print(String.format("'%s'", cookiesHeader)); // add single quotes
}
}
private void writeIncludeHeadersInOutputOption(PrintWriter writer) {
writer.print("-i");
}

View File

@@ -23,6 +23,8 @@ import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.http.Cookie;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
@@ -160,6 +162,10 @@ public class HttpieRequestSnippet extends TemplatedSnippet {
writer.print(String.format(" '%s:%s'", entry.getKey(), header));
}
}
for (Cookie cookie : request.getCookies()) {
writer.print(String.format(" 'Cookie:%s=%s'", cookie.getName(), cookie.getValue()));
}
}
private void writeParametersIfNecessary(CliOperationRequest request,

View File

@@ -24,6 +24,8 @@ import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.http.Cookie;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
@@ -35,6 +37,7 @@ import org.springframework.restdocs.snippet.Snippet;
import org.springframework.restdocs.snippet.TemplatedSnippet;
import org.springframework.util.StringUtils;
/**
* A {@link Snippet} that documents an HTTP request.
*
@@ -112,6 +115,11 @@ public class HttpRequestSnippet extends TemplatedSnippet {
}
}
for (Cookie cookie : request.getCookies()) {
headers.add(header(HttpHeaders.COOKIE, String.format("%s=%s", cookie.getName(), cookie.getValue())));
}
if (requiresFormEncodingContentTypeHeader(request)) {
headers.add(header(HttpHeaders.CONTENT_TYPE,
MediaType.APPLICATION_FORM_URLENCODED_VALUE));

View File

@@ -19,6 +19,8 @@ package org.springframework.restdocs.operation;
import java.net.URI;
import java.util.Collection;
import javax.servlet.http.Cookie;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
@@ -86,4 +88,11 @@ public interface OperationRequest {
*/
URI getUri();
/**
* Returns cookies sent with the request.
*
* @return the cookies
*/
Collection<Cookie> getCookies();
}

View File

@@ -18,6 +18,9 @@ package org.springframework.restdocs.operation;
import java.net.URI;
import java.util.Collection;
import java.util.Collections;
import javax.servlet.http.Cookie;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
@@ -29,6 +32,28 @@ import org.springframework.http.HttpMethod;
*/
public class OperationRequestFactory {
/**
* Creates a new {@link OperationRequest}. The given {@code headers} will be augmented
* to ensure that they always include a {@code Content-Length} header if the request
* has any content and a {@code Host} header.
*
* @param uri the request's uri
* @param method the request method
* @param content the content of the request
* @param headers the request's headers
* @param parameters the request's parameters
* @param parts the request's parts
* @param cookies the request's cookies
* @return the {@code OperationRequest}
*/
public OperationRequest create(URI uri, HttpMethod method, byte[] content,
HttpHeaders headers, Parameters parameters,
Collection<OperationRequestPart> parts,
Collection<Cookie> cookies) {
return new StandardOperationRequest(uri, method, content,
augmentHeaders(headers, uri, content), parameters, parts, cookies);
}
/**
* Creates a new {@link OperationRequest}. The given {@code headers} will be augmented
* to ensure that they always include a {@code Content-Length} header if the request
@@ -45,8 +70,7 @@ public class OperationRequestFactory {
public OperationRequest create(URI uri, HttpMethod method, byte[] content,
HttpHeaders headers, Parameters parameters,
Collection<OperationRequestPart> parts) {
return new StandardOperationRequest(uri, method, content,
augmentHeaders(headers, uri, content), parameters, parts);
return create(uri, method, content, headers, parameters, parts, Collections.<Cookie>emptyList());
}
/**
@@ -62,7 +86,7 @@ public class OperationRequestFactory {
public OperationRequest createFrom(OperationRequest original, byte[] newContent) {
return new StandardOperationRequest(original.getUri(), original.getMethod(),
newContent, getUpdatedHeaders(original.getHeaders(), newContent),
original.getParameters(), original.getParts());
original.getParameters(), original.getParts(), original.getCookies());
}
/**
@@ -78,7 +102,7 @@ public class OperationRequestFactory {
HttpHeaders newHeaders) {
return new StandardOperationRequest(original.getUri(), original.getMethod(),
original.getContent(), newHeaders, original.getParameters(),
original.getParts());
original.getParts(), original.getCookies());
}
/**
@@ -94,7 +118,7 @@ public class OperationRequestFactory {
Parameters newParameters) {
return new StandardOperationRequest(original.getUri(), original.getMethod(),
original.getContent(), original.getHeaders(), newParameters,
original.getParts());
original.getParts(), original.getCookies());
}
private HttpHeaders augmentHeaders(HttpHeaders originalHeaders, URI uri,

View File

@@ -20,6 +20,8 @@ import java.net.URI;
import java.util.Collection;
import java.util.Collections;
import javax.servlet.http.Cookie;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
@@ -39,6 +41,8 @@ class StandardOperationRequest extends AbstractOperationMessage
private URI uri;
private Collection<Cookie> cookies;
/**
* Creates a new request with the given {@code uri} and {@code method}. The request
* will have the given {@code headers}, {@code parameters}, and {@code parts}.
@@ -52,12 +56,14 @@ class StandardOperationRequest extends AbstractOperationMessage
*/
StandardOperationRequest(URI uri, HttpMethod method, byte[] content,
HttpHeaders headers, Parameters parameters,
Collection<OperationRequestPart> parts) {
Collection<OperationRequestPart> parts,
Collection<Cookie> cookies) {
super(content, headers);
this.uri = uri;
this.method = method;
this.parameters = parameters;
this.parts = parts;
this.cookies = cookies;
}
@Override
@@ -80,4 +86,9 @@ class StandardOperationRequest extends AbstractOperationMessage
return this.uri;
}
@Override
public Collection<Cookie> getCookies() {
return this.cookies;
}
}