package io.airlift.http.client.testing;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ListMultimap;
import com.google.common.io.CountingInputStream;
import com.google.common.net.HttpHeaders;
import com.google.common.net.MediaType;
import io.airlift.http.client.HeaderName;
import io.airlift.http.client.HttpStatus;
import io.airlift.http.client.Response;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import static com.google.common.base.MoreObjects.toStringHelper;
import static java.nio.charset.StandardCharsets.UTF_8;
import static java.util.Objects.requireNonNull;
public class TestingResponse
implements Response
{
private final HttpStatus status;
private final ListMultimap<HeaderName, String> headers;
private final CountingInputStream countingInputStream;
public TestingResponse(HttpStatus status, ListMultimap<String, String> headers, byte[] bytes)
{
this(status, headers, new ByteArrayInputStream(requireNonNull(bytes, "bytes is null")));
}
public TestingResponse(HttpStatus status, ListMultimap<String, String> headers, InputStream input)
{
this.status = requireNonNull(status, "status is null");
this.headers = ImmutableListMultimap.copyOf(toHeaderMap(requireNonNull(headers, "headers is null")));
this.countingInputStream = new CountingInputStream(requireNonNull(input, "input is null"));
}
@Override
public int getStatusCode()
{
return status.code();
}
@Override
public String getStatusMessage()
{
return status.reason();
}
@Override
public ListMultimap<HeaderName, String> getHeaders()
{
return headers;
}
@Override
public long getBytesRead()
{
return countingInputStream.getCount();
}
@Override
public InputStream getInputStream()
throws IOException
{
return countingInputStream;
}
@Override
public String toString()
{
return toStringHelper(this)
.add("statusCode", getStatusCode())
.add("statusMessage", getStatusMessage())
.add("headers", getHeaders())
.toString();
}
public static ListMultimap<String, String> contentType(MediaType type)
{
return ImmutableListMultimap.of(HttpHeaders.CONTENT_TYPE, type.toString());
}
public static Response mockResponse(HttpStatus status, MediaType type, String content)
{
return new TestingResponse(status, contentType(type), content.getBytes(UTF_8));
}
private static ListMultimap<HeaderName, String> toHeaderMap(ListMultimap<String, String> headers)
{
ImmutableListMultimap.Builder<HeaderName, String> builder = ImmutableListMultimap.builder();
for (Map.Entry<String, String> entry : headers.entries()) {
builder.put(HeaderName.of(entry.getKey()), entry.getValue());
}
return builder.build();
}
}