/*
* Copyright © 2012 The Feign Authors ([email protected])
*
* 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 feign;
import static feign.Util.*;
import feign.Request.ProtocolVersion;
import java.util.Collection;
import java.util.Map;
public final class TypedResponse {
private final int status;
private final String reason;
private final Map> headers;
private final T body;
private final Request request;
private final ProtocolVersion protocolVersion;
private TypedResponse(Builder builder) {
checkState(builder.request != null, "original request is required");
this.status = builder.status;
this.request = builder.request;
this.reason = builder.reason; // nullable
this.headers = caseInsensitiveCopyOf(builder.headers);
this.body = builder.body;
this.protocolVersion = builder.protocolVersion;
}
public static Builder builder() {
return new Builder();
}
public static Builder builder(Response source) {
return new Builder(source);
}
public static final class Builder {
int status;
String reason;
Map> headers;
T body;
Request request;
private ProtocolVersion protocolVersion = ProtocolVersion.HTTP_1_1;
Builder() {}
Builder(Response source) {
this.status = source.status();
this.reason = source.reason();
this.headers = source.headers();
this.request = source.request();
this.protocolVersion = source.protocolVersion();
}
/**
* @see TypedResponse#status
*/
public Builder status(int status) {
this.status = status;
return this;
}
/**
* @see TypedResponse#reason
*/
public Builder reason(String reason) {
this.reason = reason;
return this;
}
/**
* @see TypedResponse#headers
*/
public Builder headers(Map> headers) {
this.headers = headers;
return this;
}
/**
* @see TypedResponse#body
*/
public Builder body(T body) {
this.body = body;
return this;
}
/**
* @see TypedResponse#request
*/
public Builder request(Request request) {
checkNotNull(request, "request is required");
this.request = request;
return this;
}
/** HTTP protocol version */
public Builder protocolVersion(ProtocolVersion protocolVersion) {
this.protocolVersion = protocolVersion;
return this;
}
public TypedResponse build() {
return new TypedResponse(this);
}
}
/**
* status code. ex {@code 200}
*
* See rfc2616
*/
public int status() {
return status;
}
/**
* Nullable and not set when using http/2
*
*
See https://github.com/http2/http2-spec/issues/202
*/
public String reason() {
return reason;
}
/** Returns a case-insensitive mapping of header names to their values. */
public Map> headers() {
return headers;
}
/** if present, the response had a body */
public T body() {
return body;
}
/** the request that generated this response */
public Request request() {
return request;
}
/**
* the HTTP protocol version
*
* @return HTTP protocol version or empty if a client does not provide it
*/
public ProtocolVersion protocolVersion() {
return protocolVersion;
}
@Override
public String toString() {
StringBuilder builder =
new StringBuilder(protocolVersion.toString()).append(" ").append(status);
if (reason != null) builder.append(' ').append(reason);
builder.append('\n');
for (String field : headers.keySet()) {
for (String value : valuesOrEmpty(headers, field)) {
builder.append(field).append(": ").append(value).append('\n');
}
}
if (body != null) builder.append('\n').append(body);
return builder.toString();
}
}