Remove Headers

This commit is contained in:
Carl Mastrangelo 2015-08-17 11:06:57 -07:00
parent 13c14df055
commit a508c1d4f5
53 changed files with 292 additions and 308 deletions

View File

@ -59,7 +59,7 @@ public class ClientAuthInterceptor implements ClientInterceptor {
private final Credentials credentials; private final Credentials credentials;
private Metadata.Headers cached; private Metadata cached;
private Map<String, List<String>> lastMetadata; private Map<String, List<String>> lastMetadata;
// TODO(louiscryan): refresh token asynchronously with this executor. // TODO(louiscryan): refresh token asynchronously with this executor.
private Executor executor; private Executor executor;
@ -76,9 +76,9 @@ public class ClientAuthInterceptor implements ClientInterceptor {
// would be in WWW-Authenticate, because it does not yet have access to the header. // would be in WWW-Authenticate, because it does not yet have access to the header.
return new CheckedForwardingClientCall<ReqT, RespT>(next.newCall(method, callOptions)) { return new CheckedForwardingClientCall<ReqT, RespT>(next.newCall(method, callOptions)) {
@Override @Override
protected void checkedStart(Listener<RespT> responseListener, Metadata.Headers headers) protected void checkedStart(Listener<RespT> responseListener, Metadata headers)
throws Exception { throws Exception {
Metadata.Headers cachedSaved; Metadata cachedSaved;
synchronized (ClientAuthInterceptor.this) { synchronized (ClientAuthInterceptor.this) {
// TODO(louiscryan): This is icky but the current auth library stores the same // TODO(louiscryan): This is icky but the current auth library stores the same
// metadata map until the next refresh cycle. This will be fixed once // metadata map until the next refresh cycle. This will be fixed once
@ -104,8 +104,8 @@ public class ClientAuthInterceptor implements ClientInterceptor {
} }
} }
private static final Metadata.Headers toHeaders(Map<String, List<String>> metadata) { private static final Metadata toHeaders(Map<String, List<String>> metadata) {
Metadata.Headers headers = new Metadata.Headers(); Metadata headers = new Metadata();
if (metadata != null) { if (metadata != null) {
for (String key : metadata.keySet()) { for (String key : metadata.keySet()) {
Metadata.Key<String> headerKey = Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER); Metadata.Key<String> headerKey = Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER);

View File

@ -31,10 +31,10 @@
package io.grpc.auth; package io.grpc.auth;
import static org.mockito.Mockito.any; import static org.mockito.Matchers.any;
import static org.mockito.Mockito.isA; import static org.mockito.Matchers.isA;
import static org.mockito.Matchers.same;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.same;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@ -114,7 +114,7 @@ public class ClientAuthInterceptorTests {
when(credentials.getRequestMetadata()).thenReturn(Multimaps.asMap(values)); when(credentials.getRequestMetadata()).thenReturn(Multimaps.asMap(values));
ClientCall<String, Integer> interceptedCall = ClientCall<String, Integer> interceptedCall =
interceptor.interceptCall(descriptor, CallOptions.DEFAULT, channel); interceptor.interceptCall(descriptor, CallOptions.DEFAULT, channel);
Metadata.Headers headers = new Metadata.Headers(); Metadata headers = new Metadata();
interceptedCall.start(listener, headers); interceptedCall.start(listener, headers);
verify(call).start(listener, headers); verify(call).start(listener, headers);
@ -131,7 +131,7 @@ public class ClientAuthInterceptorTests {
when(credentials.getRequestMetadata()).thenThrow(new IOException("Broken")); when(credentials.getRequestMetadata()).thenThrow(new IOException("Broken"));
ClientCall<String, Integer> interceptedCall = ClientCall<String, Integer> interceptedCall =
interceptor.interceptCall(descriptor, CallOptions.DEFAULT, channel); interceptor.interceptCall(descriptor, CallOptions.DEFAULT, channel);
Metadata.Headers headers = new Metadata.Headers(); Metadata headers = new Metadata();
interceptedCall.start(listener, headers); interceptedCall.start(listener, headers);
ArgumentCaptor<Status> statusCaptor = ArgumentCaptor.forClass(Status.class); ArgumentCaptor<Status> statusCaptor = ArgumentCaptor.forClass(Status.class);
Mockito.verify(listener).onClose(statusCaptor.capture(), isA(Metadata.class)); Mockito.verify(listener).onClose(statusCaptor.capture(), isA(Metadata.class));
@ -142,7 +142,7 @@ public class ClientAuthInterceptorTests {
} }
@Test @Test
public void testWithOAuth2Credential() throws IOException { public void testWithOAuth2Credential() {
final AccessToken token = new AccessToken("allyourbase", new Date(Long.MAX_VALUE)); final AccessToken token = new AccessToken("allyourbase", new Date(Long.MAX_VALUE));
final OAuth2Credentials oAuth2Credentials = new OAuth2Credentials() { final OAuth2Credentials oAuth2Credentials = new OAuth2Credentials() {
@Override @Override
@ -153,7 +153,7 @@ public class ClientAuthInterceptorTests {
interceptor = new ClientAuthInterceptor(oAuth2Credentials, Executors.newSingleThreadExecutor()); interceptor = new ClientAuthInterceptor(oAuth2Credentials, Executors.newSingleThreadExecutor());
ClientCall<String, Integer> interceptedCall = ClientCall<String, Integer> interceptedCall =
interceptor.interceptCall(descriptor, CallOptions.DEFAULT, channel); interceptor.interceptCall(descriptor, CallOptions.DEFAULT, channel);
Metadata.Headers headers = new Metadata.Headers(); Metadata headers = new Metadata();
interceptedCall.start(listener, headers); interceptedCall.start(listener, headers);
verify(call).start(listener, headers); verify(call).start(listener, headers);
Iterable<String> authorization = headers.getAll(AUTHORIZATION); Iterable<String> authorization = headers.getAll(AUTHORIZATION);

View File

@ -242,7 +242,7 @@ public abstract class AbstractBenchmark {
public ServerCall.Listener<ByteBuf> startCall( public ServerCall.Listener<ByteBuf> startCall(
MethodDescriptor<ByteBuf, ByteBuf> method, MethodDescriptor<ByteBuf, ByteBuf> method,
final ServerCall<ByteBuf> call, final ServerCall<ByteBuf> call,
Metadata.Headers headers) { Metadata headers) {
call.request(1); call.request(1);
return new ServerCall.Listener<ByteBuf>() { return new ServerCall.Listener<ByteBuf>() {
@Override @Override
@ -274,7 +274,7 @@ public abstract class AbstractBenchmark {
public ServerCall.Listener<ByteBuf> startCall( public ServerCall.Listener<ByteBuf> startCall(
MethodDescriptor<ByteBuf, ByteBuf> method, MethodDescriptor<ByteBuf, ByteBuf> method,
final ServerCall<ByteBuf> call, final ServerCall<ByteBuf> call,
Metadata.Headers headers) { Metadata headers) {
call.request(1); call.request(1);
return new ServerCall.Listener<ByteBuf>() { return new ServerCall.Listener<ByteBuf>() {
@Override @Override
@ -308,7 +308,7 @@ public abstract class AbstractBenchmark {
public ServerCall.Listener<ByteBuf> startCall( public ServerCall.Listener<ByteBuf> startCall(
MethodDescriptor<ByteBuf, ByteBuf> method, MethodDescriptor<ByteBuf, ByteBuf> method,
final ServerCall<ByteBuf> call, final ServerCall<ByteBuf> call,
Metadata.Headers headers) { Metadata headers) {
call.request(1); call.request(1);
return new ServerCall.Listener<ByteBuf>() { return new ServerCall.Listener<ByteBuf>() {
@Override @Override

View File

@ -57,9 +57,29 @@ public final class CallOptions {
// unnamed arguments, which is undesirable. // unnamed arguments, which is undesirable.
private Long deadlineNanoTime; private Long deadlineNanoTime;
@Nullable @Nullable
private Compressor compressor; private Compressor compressor;
@Nullable
private String authority;
/**
* Override the HTTP/2 authority the channel claims to be connecting to. <em>This is not
* generally safe.</em> Overriding allows advanced users to re-use a single Channel for multiple
* services, even if those services are hosted on different domain names. That assumes the
* server is virtually hosting multiple domains and is guaranteed to continue doing so. It is
* rare for a service provider to make such a guarantee. <em>At this time, there is no security
* verification of the overridden value, such as making sure the authority matches the server's
* TLS certificate.</em>
*/
@ExperimentalApi
public CallOptions withAuthority(@Nullable String authority) {
CallOptions newOptions = new CallOptions(this);
newOptions.authority = authority;
return newOptions;
}
/** /**
* Returns a new {@code CallOptions} with the given absolute deadline in nanoseconds in the clock * Returns a new {@code CallOptions} with the given absolute deadline in nanoseconds in the clock
* as per {@link System#nanoTime()}. * as per {@link System#nanoTime()}.
@ -110,6 +130,20 @@ public final class CallOptions {
return newOptions; return newOptions;
} }
/**
* Override the HTTP/2 authority the channel claims to be connecting to. <em>This is not
* generally safe.</em> Overriding allows advanced users to re-use a single Channel for multiple
* services, even if those services are hosted on different domain names. That assumes the
* server is virtually hosting multiple domains and is guaranteed to continue doing so. It is
* rare for a service provider to make such a guarantee. <em>At this time, there is no security
* verification of the overridden value, such as making sure the authority matches the server's
* TLS certificate.</em>
*/
@Nullable
public String getAuthority() {
return authority;
}
private CallOptions() { private CallOptions() {
} }
@ -119,6 +153,7 @@ public final class CallOptions {
private CallOptions(CallOptions other) { private CallOptions(CallOptions other) {
deadlineNanoTime = other.deadlineNanoTime; deadlineNanoTime = other.deadlineNanoTime;
compressor = other.compressor; compressor = other.compressor;
authority = other.authority;
} }
@SuppressWarnings("deprecation") // guava 14.0 @SuppressWarnings("deprecation") // guava 14.0

View File

@ -35,7 +35,7 @@ import static io.grpc.internal.GrpcUtil.TIMER_SERVICE;
import io.grpc.ClientCallImpl.ClientTransportProvider; import io.grpc.ClientCallImpl.ClientTransportProvider;
import io.grpc.MessageEncoding.Compressor; import io.grpc.MessageEncoding.Compressor;
import io.grpc.Metadata.Headers; import io.grpc.Metadata;
import io.grpc.internal.ClientStream; import io.grpc.internal.ClientStream;
import io.grpc.internal.ClientStreamListener; import io.grpc.internal.ClientStreamListener;
import io.grpc.internal.ClientTransport; import io.grpc.internal.ClientTransport;
@ -393,7 +393,7 @@ public final class ChannelImpl extends Channel {
@Override @Override
public ClientStream newStream( public ClientStream newStream(
MethodDescriptor<?, ?> method, Headers headers, ClientStreamListener listener) { MethodDescriptor<?, ?> method, Metadata headers, ClientStreamListener listener) {
listener.closed(shutdownStatus, new Metadata()); listener.closed(shutdownStatus, new Metadata());
return new ClientCallImpl.NoopClientStream(); return new ClientCallImpl.NoopClientStream();
} }

View File

@ -80,7 +80,7 @@ public abstract class ClientCall<RequestT, ResponseT> {
* *
* @param headers containing metadata sent by the server at the start of the response. * @param headers containing metadata sent by the server at the start of the response.
*/ */
public abstract void onHeaders(Metadata.Headers headers); public abstract void onHeaders(Metadata headers);
/** /**
* A response message has been received. May be called zero or more times depending on whether * A response message has been received. May be called zero or more times depending on whether
@ -123,7 +123,7 @@ public abstract class ClientCall<RequestT, ResponseT> {
* @throws IllegalStateException if a method (including {@code start()}) on this class has been * @throws IllegalStateException if a method (including {@code start()}) on this class has been
* called. * called.
*/ */
public abstract void start(Listener<ResponseT> responseListener, Metadata.Headers headers); public abstract void start(Listener<ResponseT> responseListener, Metadata headers);
/** /**
* Requests up to the given number of messages from the call to be delivered to * Requests up to the given number of messages from the call to be delivered to

View File

@ -31,6 +31,7 @@
package io.grpc; package io.grpc;
import static io.grpc.internal.GrpcUtil.AUTHORITY_KEY;
import static io.grpc.internal.GrpcUtil.MESSAGE_ENCODING_KEY; import static io.grpc.internal.GrpcUtil.MESSAGE_ENCODING_KEY;
import static io.grpc.internal.GrpcUtil.TIMEOUT_KEY; import static io.grpc.internal.GrpcUtil.TIMEOUT_KEY;
import static io.grpc.internal.GrpcUtil.USER_AGENT_KEY; import static io.grpc.internal.GrpcUtil.USER_AGENT_KEY;
@ -94,7 +95,7 @@ final class ClientCallImpl<ReqT, RespT> extends ClientCall<ReqT, RespT> {
} }
@Override @Override
public void start(Listener<RespT> observer, Metadata.Headers headers) { public void start(Listener<RespT> observer, Metadata headers) {
Preconditions.checkState(stream == null, "Already started"); Preconditions.checkState(stream == null, "Already started");
Long deadlineNanoTime = callOptions.getDeadlineNanoTime(); Long deadlineNanoTime = callOptions.getDeadlineNanoTime();
ClientStreamListener listener = new ClientStreamListenerImpl(observer, deadlineNanoTime); ClientStreamListener listener = new ClientStreamListenerImpl(observer, deadlineNanoTime);
@ -124,6 +125,13 @@ final class ClientCallImpl<ReqT, RespT> extends ClientCall<ReqT, RespT> {
headers.put(TIMEOUT_KEY, timeoutMicros); headers.put(TIMEOUT_KEY, timeoutMicros);
} }
// Hack to propagate authority. This should be properly pass to the transport.newStream
// somehow.
headers.removeAll(AUTHORITY_KEY);
if (callOptions.getAuthority() != null) {
headers.put(AUTHORITY_KEY, callOptions.getAuthority());
}
// Fill out the User-Agent header. // Fill out the User-Agent header.
headers.removeAll(USER_AGENT_KEY); headers.removeAll(USER_AGENT_KEY);
if (userAgent != null) { if (userAgent != null) {
@ -241,7 +249,7 @@ final class ClientCallImpl<ReqT, RespT> extends ClientCall<ReqT, RespT> {
} }
@Override @Override
public void headersRead(final Metadata.Headers headers) { public void headersRead(final Metadata headers) {
callExecutor.execute(new Runnable() { callExecutor.execute(new Runnable() {
@Override @Override
public void run() { public void run() {

View File

@ -92,7 +92,7 @@ public class ClientInterceptors {
private static final ClientCall<Object, Object> NOOP_CALL = new ClientCall<Object, Object>() { private static final ClientCall<Object, Object> NOOP_CALL = new ClientCall<Object, Object>() {
@Override @Override
public void start(Listener<Object> responseListener, Metadata.Headers headers) {} public void start(Listener<Object> responseListener, Metadata headers) {}
@Override @Override
public void request(int numMessages) {} public void request(int numMessages) {}
@ -120,7 +120,7 @@ public class ClientInterceptors {
* A {@link io.grpc.ForwardingClientCall} that delivers exceptions from its start logic to the * A {@link io.grpc.ForwardingClientCall} that delivers exceptions from its start logic to the
* call listener. * call listener.
* *
* <p>{@link ClientCall#start(ClientCall.Listener, Metadata.Headers)} should not throw any * <p>{@link ClientCall#start(ClientCall.Listener, Metadata)} should not throw any
* exception other than those caused by misuse, e.g., {@link IllegalStateException}. {@code * exception other than those caused by misuse, e.g., {@link IllegalStateException}. {@code
* CheckedForwardingClientCall} provides {@code checkedStart()} in which throwing exceptions is * CheckedForwardingClientCall} provides {@code checkedStart()} in which throwing exceptions is
* allowed. * allowed.
@ -140,7 +140,7 @@ public class ClientInterceptors {
* this.delegate().start()}, as this can result in {@link ClientCall.Listener#onClose} being * this.delegate().start()}, as this can result in {@link ClientCall.Listener#onClose} being
* called multiple times. * called multiple times.
*/ */
protected abstract void checkedStart(Listener<RespT> responseListener, Metadata.Headers headers) protected abstract void checkedStart(Listener<RespT> responseListener, Metadata headers)
throws Exception; throws Exception;
protected CheckedForwardingClientCall(ClientCall<ReqT, RespT> delegate) { protected CheckedForwardingClientCall(ClientCall<ReqT, RespT> delegate) {
@ -154,7 +154,7 @@ public class ClientInterceptors {
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public final void start(Listener<RespT> responseListener, Metadata.Headers headers) { public final void start(Listener<RespT> responseListener, Metadata headers) {
try { try {
checkedStart(responseListener, headers); checkedStart(responseListener, headers);
} catch (Exception e) { } catch (Exception e) {

View File

@ -41,7 +41,7 @@ public abstract class ForwardingClientCall<ReqT, RespT> extends ClientCall<ReqT,
protected abstract ClientCall<ReqT, RespT> delegate(); protected abstract ClientCall<ReqT, RespT> delegate();
@Override @Override
public void start(Listener<RespT> responseListener, Metadata.Headers headers) { public void start(Listener<RespT> responseListener, Metadata headers) {
delegate().start(responseListener, headers); delegate().start(responseListener, headers);
} }

View File

@ -42,7 +42,7 @@ public abstract class ForwardingClientCallListener<RespT> extends ClientCall.Lis
protected abstract ClientCall.Listener<RespT> delegate(); protected abstract ClientCall.Listener<RespT> delegate();
@Override @Override
public void onHeaders(Metadata.Headers headers) { public void onHeaders(Metadata headers) {
delegate().onHeaders(headers); delegate().onHeaders(headers);
} }

View File

@ -46,7 +46,7 @@ public abstract class ForwardingServerCall<RespT> extends ServerCall<RespT> {
} }
@Override @Override
public void sendHeaders(Metadata.Headers headers) { public void sendHeaders(Metadata headers) {
delegate().sendHeaders(headers); delegate().sendHeaders(headers);
} }

View File

@ -38,6 +38,8 @@ import com.google.common.base.Function;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import io.grpc.internal.GrpcUtil;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
@ -239,6 +241,11 @@ public class Metadata {
// One *2 for keys+values, one *2 to prevent resizing if a single key has multiple values // One *2 for keys+values, one *2 to prevent resizing if a single key has multiple values
List<byte[]> serialized = new ArrayList<byte[]>(store.size() * 2 * 2); List<byte[]> serialized = new ArrayList<byte[]>(store.size() * 2 * 2);
for (Map.Entry<String, List<MetadataEntry>> keyEntry : store.entrySet()) { for (Map.Entry<String, List<MetadataEntry>> keyEntry : store.entrySet()) {
// Intentionally skip this field on serialization. It must be handled special by the
// transport.
if (keyEntry.getKey().equals(GrpcUtil.AUTHORITY_KEY.name())) {
continue;
}
for (int i = 0; i < keyEntry.getValue().size(); i++) { for (int i = 0; i < keyEntry.getValue().size(); i++) {
MetadataEntry entry = keyEntry.getValue().get(i); MetadataEntry entry = keyEntry.getValue().get(i);
byte[] asciiName; byte[] asciiName;
@ -297,84 +304,17 @@ public class Metadata {
/** /**
* Concrete instance for metadata attached to the start of a call. * Concrete instance for metadata attached to the start of a call.
*/
public static class Headers extends Metadata {
private String path;
private String authority;
/**
* Called by the transport layer to create headers from their binary serialized values.
* *
* <p>This method does not copy the provided byte arrays. The byte arrays must not be mutated. * @deprecated use Metadata instead.
*/ */
public Headers(byte[]... headers) { @Deprecated
super(headers); public static class Headers extends Metadata {
}
/** /**
* Called by the application layer to construct headers prior to passing them to the * Called by the application layer to construct headers prior to passing them to the
* transport for serialization. * transport for serialization.
*/ */
public Headers() { public Headers() {
} }
/**
* The path for the operation.
*/
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
/**
* The serving authority for the operation.
*/
public String getAuthority() {
return authority;
}
/**
* Override the HTTP/2 authority the channel claims to be connecting to. <em>This is not
* generally safe.</em> Overriding allows advanced users to re-use a single Channel for multiple
* services, even if those services are hosted on different domain names. That assumes the
* server is virtually hosting multiple domains and is guaranteed to continue doing so. It is
* rare for a service provider to make such a guarantee. <em>At this time, there is no security
* verification of the overridden value, such as making sure the authority matches the server's
* TLS certificate.</em>
*/
public void setAuthority(String authority) {
this.authority = authority;
}
@Override
public void merge(Metadata other) {
super.merge(other);
mergePathAndAuthority(other);
}
@Override
public void merge(Metadata other, Set<Key<?>> keys) {
super.merge(other, keys);
mergePathAndAuthority(other);
}
private void mergePathAndAuthority(Metadata other) {
if (other instanceof Headers) {
Headers otherHeaders = (Headers) other;
path = otherHeaders.path != null ? otherHeaders.path : path;
authority = otherHeaders.authority != null ? otherHeaders.authority : authority;
}
}
@Override
public String toString() {
return "Headers(path=" + path
+ ",authority=" + authority
+ ",metadata=" + super.toStringInternal() + ")";
}
} }
/** /**

View File

@ -121,7 +121,7 @@ public abstract class ServerCall<ResponseT> {
* @throws IllegalStateException if {@code close} has been called, a message has been sent, or * @throws IllegalStateException if {@code close} has been called, a message has been sent, or
* headers have already been sent * headers have already been sent
*/ */
public abstract void sendHeaders(Metadata.Headers headers); public abstract void sendHeaders(Metadata headers);
/** /**
* Send a response message. Messages are the primary form of communication associated with * Send a response message. Messages are the primary form of communication associated with

View File

@ -54,5 +54,5 @@ public interface ServerCallHandler<RequestT, ResponseT> {
ServerCall.Listener<RequestT> startCall( ServerCall.Listener<RequestT> startCall(
MethodDescriptor<RequestT, ResponseT> method, MethodDescriptor<RequestT, ResponseT> method,
ServerCall<ResponseT> call, ServerCall<ResponseT> call,
Metadata.Headers headers); Metadata headers);
} }

View File

@ -293,7 +293,7 @@ public final class ServerImpl extends Server {
@Override @Override
public ServerStreamListener streamCreated(final ServerStream stream, final String methodName, public ServerStreamListener streamCreated(final ServerStream stream, final String methodName,
final Metadata.Headers headers) { final Metadata headers) {
final Future<?> timeout = scheduleTimeout(stream, headers); final Future<?> timeout = scheduleTimeout(stream, headers);
SerializingExecutor serializingExecutor = new SerializingExecutor(executor); SerializingExecutor serializingExecutor = new SerializingExecutor(executor);
final JumpToApplicationThreadServerStreamListener jumpListener final JumpToApplicationThreadServerStreamListener jumpListener
@ -328,7 +328,7 @@ public final class ServerImpl extends Server {
return jumpListener; return jumpListener;
} }
private Future<?> scheduleTimeout(final ServerStream stream, Metadata.Headers headers) { private Future<?> scheduleTimeout(final ServerStream stream, Metadata headers) {
Long timeoutMicros = headers.get(TIMEOUT_KEY); Long timeoutMicros = headers.get(TIMEOUT_KEY);
if (timeoutMicros == null) { if (timeoutMicros == null) {
return DEFAULT_TIMEOUT_FUTURE; return DEFAULT_TIMEOUT_FUTURE;
@ -348,7 +348,7 @@ public final class ServerImpl extends Server {
/** Never returns {@code null}. */ /** Never returns {@code null}. */
private <ReqT, RespT> ServerStreamListener startCall(ServerStream stream, String fullMethodName, private <ReqT, RespT> ServerStreamListener startCall(ServerStream stream, String fullMethodName,
ServerMethodDefinition<ReqT, RespT> methodDef, Future<?> timeout, ServerMethodDefinition<ReqT, RespT> methodDef, Future<?> timeout,
Metadata.Headers headers) { Metadata headers) {
// TODO(ejona86): should we update fullMethodName to have the canonical path of the method? // TODO(ejona86): should we update fullMethodName to have the canonical path of the method?
final ServerCallImpl<ReqT, RespT> call = new ServerCallImpl<ReqT, RespT>( final ServerCallImpl<ReqT, RespT> call = new ServerCallImpl<ReqT, RespT>(
stream, methodDef.getMethodDescriptor()); stream, methodDef.getMethodDescriptor());
@ -489,7 +489,7 @@ public final class ServerImpl extends Server {
} }
@Override @Override
public void sendHeaders(Metadata.Headers headers) { public void sendHeaders(Metadata headers) {
Preconditions.checkState(!sendHeadersCalled, "sendHeaders has already been called"); Preconditions.checkState(!sendHeadersCalled, "sendHeaders has already been called");
Preconditions.checkState(!closeCalled, "call is closed"); Preconditions.checkState(!closeCalled, "call is closed");
Preconditions.checkState(!sendMessageCalled, "sendMessage has already been called"); Preconditions.checkState(!sendMessageCalled, "sendMessage has already been called");

View File

@ -64,6 +64,6 @@ public interface ServerInterceptor {
<RequestT, ResponseT> ServerCall.Listener<RequestT> interceptCall( <RequestT, ResponseT> ServerCall.Listener<RequestT> interceptCall(
MethodDescriptor<RequestT, ResponseT> method, MethodDescriptor<RequestT, ResponseT> method,
ServerCall<ResponseT> call, ServerCall<ResponseT> call,
Metadata.Headers headers, Metadata headers,
ServerCallHandler<RequestT, ResponseT> next); ServerCallHandler<RequestT, ResponseT> next);
} }

View File

@ -109,7 +109,7 @@ public class ServerInterceptors {
public ServerCall.Listener<ReqT> startCall( public ServerCall.Listener<ReqT> startCall(
MethodDescriptor<ReqT, RespT> method, MethodDescriptor<ReqT, RespT> method,
ServerCall<RespT> call, ServerCall<RespT> call,
Metadata.Headers headers) { Metadata headers) {
return interceptor.interceptCall(method, call, headers, callHandler); return interceptor.interceptCall(method, call, headers, callHandler);
} }
} }

View File

@ -38,6 +38,7 @@ import io.grpc.Status;
import io.grpc.internal.ClientStream; import io.grpc.internal.ClientStream;
import io.grpc.internal.ClientStreamListener; import io.grpc.internal.ClientStreamListener;
import io.grpc.internal.ClientTransport; import io.grpc.internal.ClientTransport;
import io.grpc.internal.GrpcUtil;
import io.grpc.internal.ServerStream; import io.grpc.internal.ServerStream;
import io.grpc.internal.ServerStreamListener; import io.grpc.internal.ServerStreamListener;
import io.grpc.internal.ServerTransport; import io.grpc.internal.ServerTransport;
@ -106,11 +107,12 @@ class InProcessTransport implements ServerTransport, ClientTransport {
@Override @Override
public synchronized ClientStream newStream(MethodDescriptor<?, ?> method, public synchronized ClientStream newStream(MethodDescriptor<?, ?> method,
Metadata.Headers headers, ClientStreamListener clientStreamListener) { Metadata headers, ClientStreamListener clientStreamListener) {
if (shutdownStatus != null) { if (shutdownStatus != null) {
clientStreamListener.closed(shutdownStatus, new Metadata()); clientStreamListener.closed(shutdownStatus, new Metadata());
return new NoopClientStream(); return new NoopClientStream();
} }
headers.removeAll(GrpcUtil.AUTHORITY_KEY);
InProcessStream stream = new InProcessStream(); InProcessStream stream = new InProcessStream();
stream.serverStream.setListener(clientStreamListener); stream.serverStream.setListener(clientStreamListener);
ServerStreamListener serverStreamListener = serverTransportListener.streamCreated( ServerStreamListener serverStreamListener = serverTransportListener.streamCreated(
@ -265,7 +267,7 @@ class InProcessTransport implements ServerTransport, ClientTransport {
} }
@Override @Override
public synchronized void writeHeaders(Metadata.Headers headers) { public synchronized void writeHeaders(Metadata headers) {
if (closed) { if (closed) {
return; return;
} }

View File

@ -116,7 +116,7 @@ public abstract class AbstractClientStream<IdT> extends AbstractStream<IdT>
* *
* @param headers the parsed headers * @param headers the parsed headers
*/ */
protected void inboundHeadersReceived(Metadata.Headers headers) { protected void inboundHeadersReceived(Metadata headers) {
if (inboundPhase() == Phase.STATUS) { if (inboundPhase() == Phase.STATUS) {
log.log(Level.INFO, "Received headers on closed stream {0} {1}", log.log(Level.INFO, "Received headers on closed stream {0} {1}",
new Object[]{id(), headers}); new Object[]{id(), headers});

View File

@ -91,7 +91,7 @@ public abstract class AbstractServerStream<IdT> extends AbstractStream<IdT>
} }
@Override @Override
public final void writeHeaders(Metadata.Headers headers) { public final void writeHeaders(Metadata headers) {
Preconditions.checkNotNull(headers, "headers"); Preconditions.checkNotNull(headers, "headers");
outboundPhase(Phase.HEADERS); outboundPhase(Phase.HEADERS);
headersSent = true; headersSent = true;
@ -102,7 +102,7 @@ public abstract class AbstractServerStream<IdT> extends AbstractStream<IdT>
@Override @Override
public final void writeMessage(InputStream message) { public final void writeMessage(InputStream message) {
if (!headersSent) { if (!headersSent) {
writeHeaders(new Metadata.Headers()); writeHeaders(new Metadata());
headersSent = true; headersSent = true;
} }
super.writeMessage(message); super.writeMessage(message);
@ -169,7 +169,7 @@ public abstract class AbstractServerStream<IdT> extends AbstractStream<IdT>
* *
* @param headers the headers to be sent to client. * @param headers the headers to be sent to client.
*/ */
protected abstract void internalSendHeaders(Metadata.Headers headers); protected abstract void internalSendHeaders(Metadata headers);
/** /**
* Sends an outbound frame to the remote end point. * Sends an outbound frame to the remote end point.

View File

@ -46,7 +46,7 @@ public interface ClientStreamListener extends StreamListener {
* *
* @param headers the fully buffered received headers. * @param headers the fully buffered received headers.
*/ */
void headersRead(Metadata.Headers headers); void headersRead(Metadata headers);
/** /**
* Called when the stream is fully closed. {@link * Called when the stream is fully closed. {@link

View File

@ -67,7 +67,7 @@ public interface ClientTransport {
*/ */
// TODO(nmittler): Consider also throwing for stopping. // TODO(nmittler): Consider also throwing for stopping.
ClientStream newStream(MethodDescriptor<?, ?> method, ClientStream newStream(MethodDescriptor<?, ?> method,
Metadata.Headers headers, Metadata headers,
ClientStreamListener listener); ClientStreamListener listener);
/** /**

View File

@ -61,6 +61,17 @@ public final class GrpcUtil {
public static final Metadata.Key<String> MESSAGE_ENCODING_KEY = public static final Metadata.Key<String> MESSAGE_ENCODING_KEY =
Metadata.Key.of(GrpcUtil.MESSAGE_ENCODING, Metadata.ASCII_STRING_MARSHALLER); Metadata.Key.of(GrpcUtil.MESSAGE_ENCODING, Metadata.ASCII_STRING_MARSHALLER);
/**
* {@link io.grpc.Metadata.Key} for the :authority pseudo header.
*
* <p> Don't actually serialized this.
*
* <p>TODO(carl-mastrangelo): This is a hack and should exist as shortly as possible. Remove it
* once a cleaner alternative exists (passing it directly into the transport, etc.)
*/
public static final Metadata.Key<String> AUTHORITY_KEY =
Metadata.Key.of("grpc-authority", Metadata.ASCII_STRING_MARSHALLER);
/** /**
* {@link io.grpc.Metadata.Key} for the Content-Type request/response header. * {@link io.grpc.Metadata.Key} for the Content-Type request/response header.
*/ */

View File

@ -80,7 +80,7 @@ public abstract class Http2ClientStream extends AbstractClientStream<Integer> {
* *
* @param headers the received headers * @param headers the received headers
*/ */
protected void transportHeadersReceived(Metadata.Headers headers) { protected void transportHeadersReceived(Metadata headers) {
Preconditions.checkNotNull(headers); Preconditions.checkNotNull(headers);
if (transportError != null) { if (transportError != null) {
// Already received a transport error so just augment it. // Already received a transport error so just augment it.

View File

@ -48,7 +48,7 @@ public interface ServerStream extends Stream {
* *
* @param headers to send to client. * @param headers to send to client.
*/ */
void writeHeaders(Metadata.Headers headers); void writeHeaders(Metadata headers);
/** /**
* Closes the stream for both reading and writing. A status code of * Closes the stream for both reading and writing. A status code of

View File

@ -48,7 +48,7 @@ public interface ServerTransportListener {
* @return a listener for events on the new stream. * @return a listener for events on the new stream.
*/ */
ServerStreamListener streamCreated(ServerStream stream, String method, ServerStreamListener streamCreated(ServerStream stream, String method,
Metadata.Headers headers); Metadata headers);
/** /**
* The transport completed shutting down. All resources have been released. * The transport completed shutting down. All resources have been released.

View File

@ -113,7 +113,7 @@ public class ChannelImplTest {
public void immediateDeadlineExceeded() { public void immediateDeadlineExceeded() {
ClientCall<String, Integer> call = ClientCall<String, Integer> call =
channel.newCall(method, CallOptions.DEFAULT.withDeadlineNanoTime(System.nanoTime())); channel.newCall(method, CallOptions.DEFAULT.withDeadlineNanoTime(System.nanoTime()));
call.start(mockCallListener, new Metadata.Headers()); call.start(mockCallListener, new Metadata());
verify(mockCallListener, timeout(1000)).onClose( verify(mockCallListener, timeout(1000)).onClose(
same(Status.DEADLINE_EXCEEDED), any(Metadata.class)); same(Status.DEADLINE_EXCEEDED), any(Metadata.class));
} }
@ -135,7 +135,7 @@ public class ChannelImplTest {
// Create transport and call // Create transport and call
ClientTransport mockTransport = mock(ClientTransport.class); ClientTransport mockTransport = mock(ClientTransport.class);
ClientStream mockStream = mock(ClientStream.class); ClientStream mockStream = mock(ClientStream.class);
Metadata.Headers headers = new Metadata.Headers(); Metadata headers = new Metadata();
when(mockTransportFactory.newClientTransport()).thenReturn(mockTransport); when(mockTransportFactory.newClientTransport()).thenReturn(mockTransport);
when(mockTransport.newStream(same(method), same(headers), any(ClientStreamListener.class))) when(mockTransport.newStream(same(method), same(headers), any(ClientStreamListener.class)))
.thenReturn(mockStream); .thenReturn(mockStream);
@ -150,7 +150,7 @@ public class ChannelImplTest {
// Second call // Second call
ClientCall<String, Integer> call2 = channel.newCall(method, CallOptions.DEFAULT); ClientCall<String, Integer> call2 = channel.newCall(method, CallOptions.DEFAULT);
ClientStream mockStream2 = mock(ClientStream.class); ClientStream mockStream2 = mock(ClientStream.class);
Metadata.Headers headers2 = new Metadata.Headers(); Metadata headers2 = new Metadata();
when(mockTransport.newStream(same(method), same(headers2), any(ClientStreamListener.class))) when(mockTransport.newStream(same(method), same(headers2), any(ClientStreamListener.class)))
.thenReturn(mockStream2); .thenReturn(mockStream2);
call2.start(mockCallListener2, headers2); call2.start(mockCallListener2, headers2);
@ -169,7 +169,7 @@ public class ChannelImplTest {
// Further calls should fail without going to the transport // Further calls should fail without going to the transport
ClientCall<String, Integer> call3 = channel.newCall(method, CallOptions.DEFAULT); ClientCall<String, Integer> call3 = channel.newCall(method, CallOptions.DEFAULT);
call3.start(mockCallListener3, new Metadata.Headers()); call3.start(mockCallListener3, new Metadata());
ArgumentCaptor<Status> statusCaptor = ArgumentCaptor.forClass(Status.class); ArgumentCaptor<Status> statusCaptor = ArgumentCaptor.forClass(Status.class);
verify(mockCallListener3, timeout(1000)) verify(mockCallListener3, timeout(1000))
.onClose(statusCaptor.capture(), any(Metadata.class)); .onClose(statusCaptor.capture(), any(Metadata.class));
@ -200,7 +200,7 @@ public class ChannelImplTest {
when(mockTransportFactory.newClientTransport()).thenReturn(mockTransport); when(mockTransportFactory.newClientTransport()).thenReturn(mockTransport);
doThrow(goldenStatus.asRuntimeException()) doThrow(goldenStatus.asRuntimeException())
.when(mockTransport).start(any(ClientTransport.Listener.class)); .when(mockTransport).start(any(ClientTransport.Listener.class));
call.start(mockCallListener, new Metadata.Headers()); call.start(mockCallListener, new Metadata());
verify(mockTransportFactory).newClientTransport(); verify(mockTransportFactory).newClientTransport();
verify(mockTransport).start(any(ClientTransport.Listener.class)); verify(mockTransport).start(any(ClientTransport.Listener.class));
ArgumentCaptor<Status> statusCaptor = ArgumentCaptor.forClass(Status.class); ArgumentCaptor<Status> statusCaptor = ArgumentCaptor.forClass(Status.class);
@ -212,7 +212,7 @@ public class ChannelImplTest {
call = channel.newCall(method, CallOptions.DEFAULT); call = channel.newCall(method, CallOptions.DEFAULT);
ClientTransport mockTransport2 = mock(ClientTransport.class); ClientTransport mockTransport2 = mock(ClientTransport.class);
ClientStream mockStream2 = mock(ClientStream.class); ClientStream mockStream2 = mock(ClientStream.class);
Metadata.Headers headers2 = new Metadata.Headers(); Metadata headers2 = new Metadata();
when(mockTransportFactory.newClientTransport()).thenReturn(mockTransport2); when(mockTransportFactory.newClientTransport()).thenReturn(mockTransport2);
doAnswer(new Answer<Void>() { doAnswer(new Answer<Void>() {
@Override @Override
@ -237,7 +237,7 @@ public class ChannelImplTest {
call = channel.newCall(method, CallOptions.DEFAULT); call = channel.newCall(method, CallOptions.DEFAULT);
ClientTransport mockTransport3 = mock(ClientTransport.class); ClientTransport mockTransport3 = mock(ClientTransport.class);
ClientStream mockStream3 = mock(ClientStream.class); ClientStream mockStream3 = mock(ClientStream.class);
Metadata.Headers headers3 = new Metadata.Headers(); Metadata headers3 = new Metadata();
when(mockTransportFactory.newClientTransport()).thenReturn(mockTransport3); when(mockTransportFactory.newClientTransport()).thenReturn(mockTransport3);
when(mockTransport3.newStream(same(method), same(headers3), any(ClientStreamListener.class))) when(mockTransport3.newStream(same(method), same(headers3), any(ClientStreamListener.class)))
.thenReturn(mockStream3); .thenReturn(mockStream3);
@ -289,7 +289,7 @@ public class ChannelImplTest {
public void testNoDeadlockOnShutdown() { public void testNoDeadlockOnShutdown() {
// Force creation of transport // Force creation of transport
ClientCall<String, Integer> call = channel.newCall(method, CallOptions.DEFAULT); ClientCall<String, Integer> call = channel.newCall(method, CallOptions.DEFAULT);
call.start(mockCallListener, new Metadata.Headers()); call.start(mockCallListener, new Metadata());
call.cancel(); call.cancel();
verify(mockTransport).start(transportListenerCaptor.capture()); verify(mockTransport).start(transportListenerCaptor.capture());

View File

@ -34,11 +34,11 @@ package io.grpc;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame; import static org.junit.Assert.assertSame;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.same; import static org.mockito.Matchers.same;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
@ -91,8 +91,7 @@ public class ClientInterceptorsTest {
Answer<Void> checkStartCalled = new Answer<Void>() { Answer<Void> checkStartCalled = new Answer<Void>() {
@Override @Override
public Void answer(InvocationOnMock invocation) { public Void answer(InvocationOnMock invocation) {
verify(call).start(Mockito.<ClientCall.Listener<Integer>>any(), verify(call).start(Mockito.<ClientCall.Listener<Integer>>any(), Mockito.<Metadata>any());
Mockito.<Metadata.Headers>any());
return null; return null;
} }
}; };
@ -228,7 +227,7 @@ public class ClientInterceptorsTest {
ClientCall<ReqT, RespT> call = next.newCall(method, callOptions); ClientCall<ReqT, RespT> call = next.newCall(method, callOptions);
return new SimpleForwardingClientCall<ReqT, RespT>(call) { return new SimpleForwardingClientCall<ReqT, RespT>(call) {
@Override @Override
public void start(ClientCall.Listener<RespT> responseListener, Metadata.Headers headers) { public void start(ClientCall.Listener<RespT> responseListener, Metadata headers) {
headers.put(credKey, "abcd"); headers.put(credKey, "abcd");
super.start(responseListener, headers); super.start(responseListener, headers);
} }
@ -240,8 +239,8 @@ public class ClientInterceptorsTest {
ClientCall.Listener<Integer> listener = mock(ClientCall.Listener.class); ClientCall.Listener<Integer> listener = mock(ClientCall.Listener.class);
ClientCall<String, Integer> interceptedCall = intercepted.newCall(method, CallOptions.DEFAULT); ClientCall<String, Integer> interceptedCall = intercepted.newCall(method, CallOptions.DEFAULT);
// start() on the intercepted call will eventually reach the call created by the real channel // start() on the intercepted call will eventually reach the call created by the real channel
interceptedCall.start(listener, new Metadata.Headers()); interceptedCall.start(listener, new Metadata());
ArgumentCaptor<Metadata.Headers> captor = ArgumentCaptor.forClass(Metadata.Headers.class); ArgumentCaptor<Metadata> captor = ArgumentCaptor.forClass(Metadata.class);
// The headers passed to the real channel call will contain the information inserted by the // The headers passed to the real channel call will contain the information inserted by the
// interceptor. // interceptor.
verify(call).start(same(listener), captor.capture()); verify(call).start(same(listener), captor.capture());
@ -250,7 +249,7 @@ public class ClientInterceptorsTest {
@Test @Test
public void examineInboundHeaders() { public void examineInboundHeaders() {
final List<Metadata.Headers> examinedHeaders = new ArrayList<Metadata.Headers>(); final List<Metadata> examinedHeaders = new ArrayList<Metadata>();
ClientInterceptor interceptor = new ClientInterceptor() { ClientInterceptor interceptor = new ClientInterceptor() {
@Override @Override
public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall( public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(
@ -260,10 +259,10 @@ public class ClientInterceptorsTest {
ClientCall<ReqT, RespT> call = next.newCall(method, callOptions); ClientCall<ReqT, RespT> call = next.newCall(method, callOptions);
return new SimpleForwardingClientCall<ReqT, RespT>(call) { return new SimpleForwardingClientCall<ReqT, RespT>(call) {
@Override @Override
public void start(ClientCall.Listener<RespT> responseListener, Metadata.Headers headers) { public void start(ClientCall.Listener<RespT> responseListener, Metadata headers) {
super.start(new SimpleForwardingClientCallListener<RespT>(responseListener) { super.start(new SimpleForwardingClientCallListener<RespT>(responseListener) {
@Override @Override
public void onHeaders(Metadata.Headers headers) { public void onHeaders(Metadata headers) {
examinedHeaders.add(headers); examinedHeaders.add(headers);
super.onHeaders(headers); super.onHeaders(headers);
} }
@ -276,11 +275,11 @@ public class ClientInterceptorsTest {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
ClientCall.Listener<Integer> listener = mock(ClientCall.Listener.class); ClientCall.Listener<Integer> listener = mock(ClientCall.Listener.class);
ClientCall<String, Integer> interceptedCall = intercepted.newCall(method, CallOptions.DEFAULT); ClientCall<String, Integer> interceptedCall = intercepted.newCall(method, CallOptions.DEFAULT);
interceptedCall.start(listener, new Metadata.Headers()); interceptedCall.start(listener, new Metadata());
// Capture the underlying call listener that will receive headers from the transport. // Capture the underlying call listener that will receive headers from the transport.
ArgumentCaptor<ClientCall.Listener<Integer>> captor = ArgumentCaptor.forClass(null); ArgumentCaptor<ClientCall.Listener<Integer>> captor = ArgumentCaptor.forClass(null);
verify(call).start(captor.capture(), Mockito.<Metadata.Headers>any()); verify(call).start(captor.capture(), Mockito.<Metadata>any());
Metadata.Headers inboundHeaders = new Metadata.Headers(); Metadata inboundHeaders = new Metadata();
// Simulate that a headers arrives on the underlying call listener. // Simulate that a headers arrives on the underlying call listener.
captor.getValue().onHeaders(inboundHeaders); captor.getValue().onHeaders(inboundHeaders);
assertEquals(Arrays.asList(inboundHeaders), examinedHeaders); assertEquals(Arrays.asList(inboundHeaders), examinedHeaders);
@ -303,7 +302,7 @@ public class ClientInterceptorsTest {
assertNotSame(call, interceptedCall); assertNotSame(call, interceptedCall);
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
ClientCall.Listener<Integer> listener = mock(ClientCall.Listener.class); ClientCall.Listener<Integer> listener = mock(ClientCall.Listener.class);
Metadata.Headers headers = new Metadata.Headers(); Metadata headers = new Metadata();
interceptedCall.start(listener, headers); interceptedCall.start(listener, headers);
verify(call).start(same(listener), same(headers)); verify(call).start(same(listener), same(headers));
interceptedCall.sendMessage("request"); interceptedCall.sendMessage("request");
@ -326,8 +325,8 @@ public class ClientInterceptorsTest {
ClientCall<ReqT, RespT> call = next.newCall(method, callOptions); ClientCall<ReqT, RespT> call = next.newCall(method, callOptions);
return new CheckedForwardingClientCall<ReqT, RespT>(call) { return new CheckedForwardingClientCall<ReqT, RespT>(call) {
@Override @Override
protected void checkedStart(ClientCall.Listener<RespT> responseListener, protected void checkedStart(ClientCall.Listener<RespT> responseListener, Metadata headers)
Metadata.Headers headers) throws Exception { throws Exception {
throw error; throw error;
// delegate().start will not be called // delegate().start will not be called
} }
@ -339,7 +338,7 @@ public class ClientInterceptorsTest {
ClientCall.Listener<Integer> listener = mock(ClientCall.Listener.class); ClientCall.Listener<Integer> listener = mock(ClientCall.Listener.class);
ClientCall<String, Integer> interceptedCall = intercepted.newCall(method, CallOptions.DEFAULT); ClientCall<String, Integer> interceptedCall = intercepted.newCall(method, CallOptions.DEFAULT);
assertNotSame(call, interceptedCall); assertNotSame(call, interceptedCall);
interceptedCall.start(listener, new Metadata.Headers()); interceptedCall.start(listener, new Metadata());
interceptedCall.sendMessage("request"); interceptedCall.sendMessage("request");
interceptedCall.halfClose(); interceptedCall.halfClose();
interceptedCall.request(1); interceptedCall.request(1);

View File

@ -76,7 +76,7 @@ public class MetadataTest {
public void testMutations() { public void testMutations() {
Fish lance = new Fish(LANCE); Fish lance = new Fish(LANCE);
Fish cat = new Fish("cat"); Fish cat = new Fish("cat");
Metadata.Headers metadata = new Metadata.Headers(); Metadata metadata = new Metadata();
assertEquals(null, metadata.get(KEY)); assertEquals(null, metadata.get(KEY));
metadata.put(KEY, lance); metadata.put(KEY, lance);
@ -107,7 +107,7 @@ public class MetadataTest {
@Test @Test
public void testWriteParsed() { public void testWriteParsed() {
Fish lance = new Fish(LANCE); Fish lance = new Fish(LANCE);
Metadata.Headers metadata = new Metadata.Headers(); Metadata metadata = new Metadata();
metadata.put(KEY, lance); metadata.put(KEY, lance);
// Should be able to read same instance out // Should be able to read same instance out
assertSame(lance, metadata.get(KEY)); assertSame(lance, metadata.get(KEY));
@ -127,7 +127,7 @@ public class MetadataTest {
@Test @Test
public void testWriteRaw() { public void testWriteRaw() {
Metadata.Headers raw = new Metadata.Headers(KEY.asciiName(), LANCE_BYTES); Metadata raw = new Metadata(KEY.asciiName(), LANCE_BYTES);
Fish lance = raw.get(KEY); Fish lance = raw.get(KEY);
assertEquals(lance, new Fish(LANCE)); assertEquals(lance, new Fish(LANCE));
// Reading again should return the same parsed instance // Reading again should return the same parsed instance
@ -136,7 +136,7 @@ public class MetadataTest {
@Test @Test
public void testSerializeRaw() { public void testSerializeRaw() {
Metadata.Headers raw = new Metadata.Headers(KEY.asciiName(), LANCE_BYTES); Metadata raw = new Metadata(KEY.asciiName(), LANCE_BYTES);
byte[][] serialized = raw.serialize(); byte[][] serialized = raw.serialize();
assertArrayEquals(serialized[0], KEY.asciiName()); assertArrayEquals(serialized[0], KEY.asciiName());
assertArrayEquals(serialized[1], LANCE_BYTES); assertArrayEquals(serialized[1], LANCE_BYTES);
@ -144,8 +144,8 @@ public class MetadataTest {
@Test @Test
public void testMergeByteConstructed() { public void testMergeByteConstructed() {
Metadata.Headers raw = new Metadata.Headers(KEY.asciiName(), LANCE_BYTES); Metadata raw = new Metadata(KEY.asciiName(), LANCE_BYTES);
Metadata.Headers serializable = new Metadata.Headers(); Metadata serializable = new Metadata();
serializable.merge(raw); serializable.merge(raw);
byte[][] serialized = serializable.serialize(); byte[][] serialized = serializable.serialize();
@ -157,11 +157,9 @@ public class MetadataTest {
@Test @Test
public void headerMergeShouldCopyValues() { public void headerMergeShouldCopyValues() {
Fish lance = new Fish(LANCE); Fish lance = new Fish(LANCE);
Metadata.Headers h1 = new Metadata.Headers(); Metadata h1 = new Metadata();
Metadata.Headers h2 = new Metadata.Headers(); Metadata h2 = new Metadata();
h2.setPath("/some/path");
h2.setAuthority("authority");
h2.put(KEY, lance); h2.put(KEY, lance);
h1.merge(h2); h1.merge(h2);
@ -170,8 +168,6 @@ public class MetadataTest {
assertTrue(fishes.hasNext()); assertTrue(fishes.hasNext());
assertSame(fishes.next(), lance); assertSame(fishes.next(), lance);
assertFalse(fishes.hasNext()); assertFalse(fishes.hasNext());
assertEquals("/some/path", h1.getPath());
assertEquals("authority", h1.getAuthority());
} }
@Test @Test
@ -195,13 +191,10 @@ public class MetadataTest {
@Test @Test
public void verifyToString() { public void verifyToString() {
Metadata.Headers h = new Metadata.Headers(); Metadata h = new Metadata();
h.setPath("/path");
h.setAuthority("myauthority");
h.put(KEY, new Fish("binary")); h.put(KEY, new Fish("binary"));
h.put(Metadata.Key.of("test", Metadata.ASCII_STRING_MARSHALLER), "ascii"); h.put(Metadata.Key.of("test", Metadata.ASCII_STRING_MARSHALLER), "ascii");
assertEquals("Headers(path=/path,authority=myauthority," assertEquals("Metadata({test-bin=[Fish(binary)], test=[ascii]})", h.toString());
+ "metadata={test-bin=[Fish(binary)], test=[ascii]})", h.toString());
Metadata t = new Metadata(); Metadata t = new Metadata();
t.put(Metadata.Key.of("test", Metadata.ASCII_STRING_MARSHALLER), "ascii"); t.put(Metadata.Key.of("test", Metadata.ASCII_STRING_MARSHALLER), "ascii");
@ -229,7 +222,7 @@ public class MetadataTest {
Metadata.Key<String> keyUpperCase Metadata.Key<String> keyUpperCase
= Metadata.Key.of("IF-MODIFIED-SINCE", Metadata.ASCII_STRING_MARSHALLER); = Metadata.Key.of("IF-MODIFIED-SINCE", Metadata.ASCII_STRING_MARSHALLER);
Metadata metadata = new Metadata.Headers(); Metadata metadata = new Metadata();
metadata.put(keyTitleCase, "plain string"); metadata.put(keyTitleCase, "plain string");
assertEquals("plain string", metadata.get(keyTitleCase)); assertEquals("plain string", metadata.get(keyTitleCase));
assertEquals("plain string", metadata.get(keyLowerCase)); assertEquals("plain string", metadata.get(keyLowerCase));

View File

@ -186,7 +186,7 @@ public class ServerImplTest {
public ServerCall.Listener<String> startCall( public ServerCall.Listener<String> startCall(
MethodDescriptor<String, Integer> method, MethodDescriptor<String, Integer> method,
ServerCall<Integer> call, ServerCall<Integer> call,
Metadata.Headers headers) { Metadata headers) {
assertEquals("Waiter/serve", method.getFullMethodName()); assertEquals("Waiter/serve", method.getFullMethodName());
assertNotNull(call); assertNotNull(call);
assertNotNull(headers); assertNotNull(headers);
@ -198,7 +198,7 @@ public class ServerImplTest {
ServerTransportListener transportListener ServerTransportListener transportListener
= transportServer.registerNewServerTransport(new SimpleServerTransport()); = transportServer.registerNewServerTransport(new SimpleServerTransport());
Metadata.Headers headers = new Metadata.Headers(); Metadata headers = new Metadata();
headers.put(metadataKey, 0); headers.put(metadataKey, 0);
ServerStreamListener streamListener ServerStreamListener streamListener
= transportListener.streamCreated(stream, "Waiter/serve", headers); = transportListener.streamCreated(stream, "Waiter/serve", headers);
@ -254,7 +254,7 @@ public class ServerImplTest {
public ServerCall.Listener<String> startCall( public ServerCall.Listener<String> startCall(
MethodDescriptor<String, Integer> method, MethodDescriptor<String, Integer> method,
ServerCall<Integer> call, ServerCall<Integer> call,
Metadata.Headers headers) { Metadata headers) {
throw status.asRuntimeException(); throw status.asRuntimeException();
} }
}).build()); }).build());
@ -262,7 +262,7 @@ public class ServerImplTest {
= transportServer.registerNewServerTransport(new SimpleServerTransport()); = transportServer.registerNewServerTransport(new SimpleServerTransport());
ServerStreamListener streamListener ServerStreamListener streamListener
= transportListener.streamCreated(stream, "Waiter/serve", new Metadata.Headers()); = transportListener.streamCreated(stream, "Waiter/serve", new Metadata());
assertNotNull(streamListener); assertNotNull(streamListener);
verifyNoMoreInteractions(stream); verifyNoMoreInteractions(stream);

View File

@ -41,7 +41,7 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.verifyZeroInteractions;
import io.grpc.Metadata.Headers; import io.grpc.Metadata;
import io.grpc.MethodDescriptor.Marshaller; import io.grpc.MethodDescriptor.Marshaller;
import io.grpc.MethodDescriptor.MethodType; import io.grpc.MethodDescriptor.MethodType;
import io.grpc.ServerCall.Listener; import io.grpc.ServerCall.Listener;
@ -80,7 +80,7 @@ public class ServerInterceptorsTest {
MethodDescriptor.create( MethodDescriptor.create(
MethodType.UNKNOWN, "basic/flow", requestMarshaller, responseMarshaller), MethodType.UNKNOWN, "basic/flow", requestMarshaller, responseMarshaller),
handler).build(); handler).build();
private Headers headers = new Headers(); private Metadata headers = new Metadata();
/** Set up for test. */ /** Set up for test. */
@Before @Before
@ -88,7 +88,7 @@ public class ServerInterceptorsTest {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
Mockito.when(handler.startCall( Mockito.when(handler.startCall(
Mockito.<MethodDescriptor<String, Integer>>any(), Mockito.<MethodDescriptor<String, Integer>>any(),
Mockito.<ServerCall<Integer>>any(), Mockito.<Headers>any())) Mockito.<ServerCall<Integer>>any(), Mockito.<Metadata>any()))
.thenReturn(listener); .thenReturn(listener);
} }
@ -172,7 +172,7 @@ public class ServerInterceptorsTest {
public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall( public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(
MethodDescriptor<ReqT, RespT> method, MethodDescriptor<ReqT, RespT> method,
ServerCall<RespT> call, ServerCall<RespT> call,
Headers headers, Metadata headers,
ServerCallHandler<ReqT, RespT> next) { ServerCallHandler<ReqT, RespT> next) {
// Calling next twice is permitted, although should only rarely be useful. // Calling next twice is permitted, although should only rarely be useful.
assertSame(listener, next.startCall(method, call, headers)); assertSame(listener, next.startCall(method, call, headers));
@ -195,7 +195,7 @@ public class ServerInterceptorsTest {
public ServerCall.Listener<String> startCall( public ServerCall.Listener<String> startCall(
MethodDescriptor<String, Integer> method, MethodDescriptor<String, Integer> method,
ServerCall<Integer> call, ServerCall<Integer> call,
Headers headers) { Metadata headers) {
order.add("handler"); order.add("handler");
return listener; return listener;
} }
@ -205,7 +205,7 @@ public class ServerInterceptorsTest {
public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall( public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(
MethodDescriptor<ReqT, RespT> method, MethodDescriptor<ReqT, RespT> method,
ServerCall<RespT> call, ServerCall<RespT> call,
Headers headers, Metadata headers,
ServerCallHandler<ReqT, RespT> next) { ServerCallHandler<ReqT, RespT> next) {
order.add("i1"); order.add("i1");
return next.startCall(method, call, headers); return next.startCall(method, call, headers);
@ -216,7 +216,7 @@ public class ServerInterceptorsTest {
public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall( public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(
MethodDescriptor<ReqT, RespT> method, MethodDescriptor<ReqT, RespT> method,
ServerCall<RespT> call, ServerCall<RespT> call,
Headers headers, Metadata headers,
ServerCallHandler<ReqT, RespT> next) { ServerCallHandler<ReqT, RespT> next) {
order.add("i2"); order.add("i2");
return next.startCall(method, call, headers); return next.startCall(method, call, headers);
@ -247,7 +247,7 @@ public class ServerInterceptorsTest {
public <R1, R2> ServerCall.Listener<R1> interceptCall( public <R1, R2> ServerCall.Listener<R1> interceptCall(
MethodDescriptor<R1, R2> methodDescriptor, MethodDescriptor<R1, R2> methodDescriptor,
ServerCall<R2> call, ServerCall<R2> call,
Headers headers, Metadata headers,
ServerCallHandler<R1, R2> next) { ServerCallHandler<R1, R2> next) {
assertSame(method, methodDescriptor); assertSame(method, methodDescriptor);
assertSame(call, ServerInterceptorsTest.this.call); assertSame(call, ServerInterceptorsTest.this.call);
@ -287,7 +287,7 @@ public class ServerInterceptorsTest {
public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall( public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(
MethodDescriptor<ReqT, RespT> method, MethodDescriptor<ReqT, RespT> method,
ServerCall<RespT> call, ServerCall<RespT> call,
Headers headers, Metadata headers,
ServerCallHandler<ReqT, RespT> next) { ServerCallHandler<ReqT, RespT> next) {
return next.startCall(method, call, headers); return next.startCall(method, call, headers);
} }

View File

@ -38,7 +38,6 @@ import static org.mockito.Mockito.verify;
import io.grpc.MessageEncoding; import io.grpc.MessageEncoding;
import io.grpc.Metadata; import io.grpc.Metadata;
import io.grpc.Metadata.Headers;
import io.grpc.Status; import io.grpc.Status;
import io.grpc.Status.Code; import io.grpc.Status.Code;
import io.grpc.internal.AbstractStream.Phase; import io.grpc.internal.AbstractStream.Phase;
@ -172,7 +171,7 @@ public class AbstractClientStreamTest {
public void inboundHeadersReceived_notifiesListener() { public void inboundHeadersReceived_notifiesListener() {
AbstractClientStream<Integer> stream = AbstractClientStream<Integer> stream =
new BaseAbstractClientStream<Integer>(allocator, mockListener); new BaseAbstractClientStream<Integer>(allocator, mockListener);
Headers headers = new Metadata.Headers(); Metadata headers = new Metadata();
stream.inboundHeadersReceived(headers); stream.inboundHeadersReceived(headers);
verify(mockListener).headersRead(headers); verify(mockListener).headersRead(headers);
@ -182,7 +181,7 @@ public class AbstractClientStreamTest {
public void inboundHeadersReceived_failsOnPhaseStatus() { public void inboundHeadersReceived_failsOnPhaseStatus() {
AbstractClientStream<Integer> stream = AbstractClientStream<Integer> stream =
new BaseAbstractClientStream<Integer>(allocator, mockListener); new BaseAbstractClientStream<Integer>(allocator, mockListener);
Headers headers = new Metadata.Headers(); Metadata headers = new Metadata();
stream.inboundPhase(Phase.STATUS); stream.inboundPhase(Phase.STATUS);
thrown.expect(IllegalStateException.class); thrown.expect(IllegalStateException.class);
@ -194,7 +193,7 @@ public class AbstractClientStreamTest {
public void inboundHeadersReceived_succeedsOnPhaseMessage() { public void inboundHeadersReceived_succeedsOnPhaseMessage() {
AbstractClientStream<Integer> stream = AbstractClientStream<Integer> stream =
new BaseAbstractClientStream<Integer>(allocator, mockListener); new BaseAbstractClientStream<Integer>(allocator, mockListener);
Headers headers = new Metadata.Headers(); Metadata headers = new Metadata();
stream.inboundPhase(Phase.MESSAGE); stream.inboundPhase(Phase.MESSAGE);
stream.inboundHeadersReceived(headers); stream.inboundHeadersReceived(headers);
@ -206,7 +205,7 @@ public class AbstractClientStreamTest {
public void inboundHeadersReceived_acceptsGzipEncoding() { public void inboundHeadersReceived_acceptsGzipEncoding() {
AbstractClientStream<Integer> stream = AbstractClientStream<Integer> stream =
new BaseAbstractClientStream<Integer>(allocator, mockListener); new BaseAbstractClientStream<Integer>(allocator, mockListener);
Headers headers = new Metadata.Headers(); Metadata headers = new Metadata();
headers.put(GrpcUtil.MESSAGE_ENCODING_KEY, new MessageEncoding.Gzip().getMessageEncoding()); headers.put(GrpcUtil.MESSAGE_ENCODING_KEY, new MessageEncoding.Gzip().getMessageEncoding());
stream.inboundHeadersReceived(headers); stream.inboundHeadersReceived(headers);
@ -217,7 +216,7 @@ public class AbstractClientStreamTest {
public void inboundHeadersReceived_acceptsIdentityEncoding() { public void inboundHeadersReceived_acceptsIdentityEncoding() {
AbstractClientStream<Integer> stream = AbstractClientStream<Integer> stream =
new BaseAbstractClientStream<Integer>(allocator, mockListener); new BaseAbstractClientStream<Integer>(allocator, mockListener);
Headers headers = new Metadata.Headers(); Metadata headers = new Metadata();
headers.put(GrpcUtil.MESSAGE_ENCODING_KEY, MessageEncoding.NONE.getMessageEncoding()); headers.put(GrpcUtil.MESSAGE_ENCODING_KEY, MessageEncoding.NONE.getMessageEncoding());
stream.inboundHeadersReceived(headers); stream.inboundHeadersReceived(headers);
@ -228,7 +227,7 @@ public class AbstractClientStreamTest {
public void inboundHeadersReceived_notifiesListenerOnBadEncoding() { public void inboundHeadersReceived_notifiesListenerOnBadEncoding() {
AbstractClientStream<Integer> stream = AbstractClientStream<Integer> stream =
new BaseAbstractClientStream<Integer>(allocator, mockListener); new BaseAbstractClientStream<Integer>(allocator, mockListener);
Headers headers = new Metadata.Headers(); Metadata headers = new Metadata();
headers.put(GrpcUtil.MESSAGE_ENCODING_KEY, "bad"); headers.put(GrpcUtil.MESSAGE_ENCODING_KEY, "bad");
stream.inboundHeadersReceived(headers); stream.inboundHeadersReceived(headers);
@ -275,7 +274,7 @@ public class AbstractClientStreamTest {
public void onReady() {} public void onReady() {}
@Override @Override
public void headersRead(Headers headers) {} public void headersRead(Metadata headers) {}
@Override @Override
public void closed(Status status, Metadata trailers) {} public void closed(Status status, Metadata trailers) {}

View File

@ -41,8 +41,8 @@ import static org.junit.Assert.fail;
import com.google.common.io.BaseEncoding; import com.google.common.io.BaseEncoding;
import io.grpc.Metadata;
import io.grpc.Metadata.BinaryMarshaller; import io.grpc.Metadata.BinaryMarshaller;
import io.grpc.Metadata.Headers;
import io.grpc.Metadata.Key; import io.grpc.Metadata.Key;
import org.junit.Test; import org.junit.Test;
@ -79,7 +79,7 @@ public class TransportFrameUtilTest {
@Test @Test
public void testToHttp2Headers() { public void testToHttp2Headers() {
Headers headers = new Headers(); Metadata headers = new Metadata();
headers.put(PLAIN_STRING, COMPLIANT_ASCII_STRING); headers.put(PLAIN_STRING, COMPLIANT_ASCII_STRING);
headers.put(BINARY_STRING, NONCOMPLIANT_ASCII_STRING); headers.put(BINARY_STRING, NONCOMPLIANT_ASCII_STRING);
headers.put(BINARY_STRING_WITHOUT_SUFFIX, NONCOMPLIANT_ASCII_STRING); headers.put(BINARY_STRING_WITHOUT_SUFFIX, NONCOMPLIANT_ASCII_STRING);
@ -104,13 +104,13 @@ public class TransportFrameUtilTest {
@Test @Test
public void testToAndFromHttp2Headers() { public void testToAndFromHttp2Headers() {
Headers headers = new Headers(); Metadata headers = new Metadata();
headers.put(PLAIN_STRING, COMPLIANT_ASCII_STRING); headers.put(PLAIN_STRING, COMPLIANT_ASCII_STRING);
headers.put(BINARY_STRING, NONCOMPLIANT_ASCII_STRING); headers.put(BINARY_STRING, NONCOMPLIANT_ASCII_STRING);
headers.put(BINARY_STRING_WITHOUT_SUFFIX, NONCOMPLIANT_ASCII_STRING); headers.put(BINARY_STRING_WITHOUT_SUFFIX, NONCOMPLIANT_ASCII_STRING);
byte[][] http2Headers = TransportFrameUtil.toHttp2Headers(headers); byte[][] http2Headers = TransportFrameUtil.toHttp2Headers(headers);
byte[][] rawSerialized = TransportFrameUtil.toRawSerializedHeaders(http2Headers); byte[][] rawSerialized = TransportFrameUtil.toRawSerializedHeaders(http2Headers);
Headers recoveredHeaders = new Headers(rawSerialized); Metadata recoveredHeaders = new Metadata(rawSerialized);
assertEquals(COMPLIANT_ASCII_STRING, recoveredHeaders.get(PLAIN_STRING)); assertEquals(COMPLIANT_ASCII_STRING, recoveredHeaders.get(PLAIN_STRING));
assertEquals(NONCOMPLIANT_ASCII_STRING, recoveredHeaders.get(BINARY_STRING)); assertEquals(NONCOMPLIANT_ASCII_STRING, recoveredHeaders.get(BINARY_STRING));
assertNull(recoveredHeaders.get(BINARY_STRING_WITHOUT_SUFFIX)); assertNull(recoveredHeaders.get(BINARY_STRING_WITHOUT_SUFFIX));

View File

@ -58,12 +58,12 @@ public class HeaderClientInterceptor implements ClientInterceptor {
return new SimpleForwardingClientCall<ReqT, RespT>(next.newCall(method, callOptions)) { return new SimpleForwardingClientCall<ReqT, RespT>(next.newCall(method, callOptions)) {
@Override @Override
public void start(Listener<RespT> responseListener, Metadata.Headers headers) { public void start(Listener<RespT> responseListener, Metadata headers) {
/* put custom header */ /* put custom header */
headers.put(customHeadKey, "customRequestValue"); headers.put(customHeadKey, "customRequestValue");
super.start(new SimpleForwardingClientCallListener<RespT>(responseListener) { super.start(new SimpleForwardingClientCallListener<RespT>(responseListener) {
@Override @Override
public void onHeaders(Metadata.Headers headers) { public void onHeaders(Metadata headers) {
/** /**
* if you don't need receive header from server, * if you don't need receive header from server,
* you can use {@link io.grpc.stub.MetadataUtils attachHeaders} * you can use {@link io.grpc.stub.MetadataUtils attachHeaders}

View File

@ -56,14 +56,14 @@ public class HeaderServerInterceptor implements ServerInterceptor {
public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall( public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(
MethodDescriptor<ReqT, RespT> method, MethodDescriptor<ReqT, RespT> method,
ServerCall<RespT> call, ServerCall<RespT> call,
final Metadata.Headers requestHeaders, final Metadata requestHeaders,
ServerCallHandler<ReqT, RespT> next) { ServerCallHandler<ReqT, RespT> next) {
logger.info("header received from client:" + requestHeaders.toString()); logger.info("header received from client:" + requestHeaders.toString());
return next.startCall(method, new SimpleForwardingServerCall<RespT>(call) { return next.startCall(method, new SimpleForwardingServerCall<RespT>(call) {
boolean sentHeaders = false; boolean sentHeaders = false;
@Override @Override
public void sendHeaders(Metadata.Headers responseHeaders) { public void sendHeaders(Metadata responseHeaders) {
responseHeaders.put(customHeadKey, "customRespondValue"); responseHeaders.put(customHeadKey, "customRespondValue");
super.sendHeaders(responseHeaders); super.sendHeaders(responseHeaders);
sentHeaders = true; sentHeaders = true;
@ -72,7 +72,7 @@ public class HeaderServerInterceptor implements ServerInterceptor {
@Override @Override
public void sendMessage(RespT message) { public void sendMessage(RespT message) {
if (!sentHeaders) { if (!sentHeaders) {
sendHeaders(new Metadata.Headers()); sendHeaders(new Metadata());
} }
super.sendMessage(message); super.sendMessage(message);
} }

View File

@ -99,8 +99,8 @@ public abstract class AbstractTransportTest {
public static final Metadata.Key<Messages.SimpleContext> METADATA_KEY = public static final Metadata.Key<Messages.SimpleContext> METADATA_KEY =
ProtoUtils.keyForProto(Messages.SimpleContext.getDefaultInstance()); ProtoUtils.keyForProto(Messages.SimpleContext.getDefaultInstance());
private static final AtomicReference<Metadata.Headers> requestHeadersCapture = private static final AtomicReference<Metadata> requestHeadersCapture =
new AtomicReference<Metadata.Headers>(); new AtomicReference<Metadata>();
private static ScheduledExecutorService testServiceExecutor; private static ScheduledExecutorService testServiceExecutor;
private static ServerImpl server; private static ServerImpl server;
private static int OPERATION_TIMEOUT = 5000; private static int OPERATION_TIMEOUT = 5000;
@ -449,7 +449,7 @@ public abstract class AbstractTransportTest {
channel.newCall(TestServiceGrpc.METHOD_STREAMING_OUTPUT_CALL, CallOptions.DEFAULT); channel.newCall(TestServiceGrpc.METHOD_STREAMING_OUTPUT_CALL, CallOptions.DEFAULT);
call.start(new ClientCall.Listener<StreamingOutputCallResponse>() { call.start(new ClientCall.Listener<StreamingOutputCallResponse>() {
@Override @Override
public void onHeaders(Metadata.Headers headers) {} public void onHeaders(Metadata headers) {}
@Override @Override
public void onMessage(final StreamingOutputCallResponse message) { public void onMessage(final StreamingOutputCallResponse message) {
@ -460,7 +460,7 @@ public abstract class AbstractTransportTest {
public void onClose(Status status, Metadata trailers) { public void onClose(Status status, Metadata trailers) {
queue.add(status); queue.add(status);
} }
}, new Metadata.Headers()); }, new Metadata());
call.sendMessage(request); call.sendMessage(request);
call.halfClose(); call.halfClose();
@ -521,7 +521,7 @@ public abstract class AbstractTransportTest {
TestServiceGrpc.newBlockingStub(channel); TestServiceGrpc.newBlockingStub(channel);
// Capture the context exchange // Capture the context exchange
Metadata.Headers fixedHeaders = new Metadata.Headers(); Metadata fixedHeaders = new Metadata();
// Send a context proto (as it's in the default extension registry) // Send a context proto (as it's in the default extension registry)
Messages.SimpleContext contextValue = Messages.SimpleContext contextValue =
Messages.SimpleContext.newBuilder().setValue("dog").build(); Messages.SimpleContext.newBuilder().setValue("dog").build();
@ -529,7 +529,7 @@ public abstract class AbstractTransportTest {
stub = MetadataUtils.attachHeaders(stub, fixedHeaders); stub = MetadataUtils.attachHeaders(stub, fixedHeaders);
// .. and expect it to be echoed back in trailers // .. and expect it to be echoed back in trailers
AtomicReference<Metadata> trailersCapture = new AtomicReference<Metadata>(); AtomicReference<Metadata> trailersCapture = new AtomicReference<Metadata>();
AtomicReference<Metadata.Headers> headersCapture = new AtomicReference<Metadata.Headers>(); AtomicReference<Metadata> headersCapture = new AtomicReference<Metadata>();
stub = MetadataUtils.captureMetadata(stub, headersCapture, trailersCapture); stub = MetadataUtils.captureMetadata(stub, headersCapture, trailersCapture);
Assert.assertNotNull(stub.emptyCall(Empty.getDefaultInstance())); Assert.assertNotNull(stub.emptyCall(Empty.getDefaultInstance()));
@ -544,7 +544,7 @@ public abstract class AbstractTransportTest {
TestServiceGrpc.TestServiceStub stub = TestServiceGrpc.newStub(channel); TestServiceGrpc.TestServiceStub stub = TestServiceGrpc.newStub(channel);
// Capture the context exchange // Capture the context exchange
Metadata.Headers fixedHeaders = new Metadata.Headers(); Metadata fixedHeaders = new Metadata();
// Send a context proto (as it's in the default extension registry) // Send a context proto (as it's in the default extension registry)
Messages.SimpleContext contextValue = Messages.SimpleContext contextValue =
Messages.SimpleContext.newBuilder().setValue("dog").build(); Messages.SimpleContext.newBuilder().setValue("dog").build();
@ -552,7 +552,7 @@ public abstract class AbstractTransportTest {
stub = MetadataUtils.attachHeaders(stub, fixedHeaders); stub = MetadataUtils.attachHeaders(stub, fixedHeaders);
// .. and expect it to be echoed back in trailers // .. and expect it to be echoed back in trailers
AtomicReference<Metadata> trailersCapture = new AtomicReference<Metadata>(); AtomicReference<Metadata> trailersCapture = new AtomicReference<Metadata>();
AtomicReference<Metadata.Headers> headersCapture = new AtomicReference<Metadata.Headers>(); AtomicReference<Metadata> headersCapture = new AtomicReference<Metadata>();
stub = MetadataUtils.captureMetadata(stub, headersCapture, trailersCapture); stub = MetadataUtils.captureMetadata(stub, headersCapture, trailersCapture);
List<Integer> responseSizes = Arrays.asList(50, 100, 150, 200); List<Integer> responseSizes = Arrays.asList(50, 100, 150, 200);

View File

@ -31,6 +31,7 @@
package io.grpc.netty; package io.grpc.netty;
import static io.grpc.internal.GrpcUtil.AUTHORITY_KEY;
import static io.netty.channel.ChannelOption.SO_KEEPALIVE; import static io.netty.channel.ChannelOption.SO_KEEPALIVE;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
@ -120,7 +121,7 @@ class NettyClientTransport implements ClientTransport {
} }
@Override @Override
public ClientStream newStream(MethodDescriptor<?, ?> method, Metadata.Headers headers, public ClientStream newStream(MethodDescriptor<?, ?> method, Metadata headers,
ClientStreamListener listener) { ClientStreamListener listener) {
Preconditions.checkNotNull(method, "method"); Preconditions.checkNotNull(method, "method");
Preconditions.checkNotNull(headers, "headers"); Preconditions.checkNotNull(headers, "headers");
@ -131,8 +132,11 @@ class NettyClientTransport implements ClientTransport {
// Convert the headers into Netty HTTP/2 headers. // Convert the headers into Netty HTTP/2 headers.
AsciiString defaultPath = new AsciiString("/" + method.getFullMethodName()); AsciiString defaultPath = new AsciiString("/" + method.getFullMethodName());
AsciiString defaultAuthority = new AsciiString(headers.containsKey(AUTHORITY_KEY)
? headers.get(AUTHORITY_KEY) : authority);
headers.removeAll(AUTHORITY_KEY);
Http2Headers http2Headers = Utils.convertClientHeaders(headers, negotiationHandler.scheme(), Http2Headers http2Headers = Utils.convertClientHeaders(headers, negotiationHandler.scheme(),
defaultPath, authority); defaultPath, defaultAuthority);
ChannelFutureListener failureListener = new ChannelFutureListener() { ChannelFutureListener failureListener = new ChannelFutureListener() {
@Override @Override

View File

@ -39,12 +39,11 @@ import static io.grpc.netty.Utils.TE_TRAILERS;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import io.grpc.Metadata.Headers; import io.grpc.Metadata;
import io.grpc.Status; import io.grpc.Status;
import io.grpc.internal.GrpcUtil; import io.grpc.internal.GrpcUtil;
import io.grpc.internal.ServerStreamListener; import io.grpc.internal.ServerStreamListener;
import io.grpc.internal.ServerTransportListener; import io.grpc.internal.ServerTransportListener;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelFutureListener;
@ -151,7 +150,7 @@ class NettyServerHandler extends Http2ConnectionHandler {
http2Stream.setProperty(streamKey, stream); http2Stream.setProperty(streamKey, stream);
String method = determineMethod(streamId, headers); String method = determineMethod(streamId, headers);
Headers metadata = Utils.convertHeaders(headers); Metadata metadata = Utils.convertHeaders(headers);
ServerStreamListener listener = ServerStreamListener listener =
transportListener.streamCreated(stream, method, metadata); transportListener.streamCreated(stream, method, metadata);
stream.setListener(listener); stream.setListener(listener);

View File

@ -87,7 +87,7 @@ class NettyServerStream extends AbstractServerStream<Integer> {
} }
@Override @Override
protected void internalSendHeaders(Metadata.Headers headers) { protected void internalSendHeaders(Metadata headers) {
writeQueue.enqueue(new SendResponseHeadersCommand(id(), writeQueue.enqueue(new SendResponseHeadersCommand(id(),
Utils.convertServerHeaders(headers), false), Utils.convertServerHeaders(headers), false),
true); true);

View File

@ -31,6 +31,7 @@
package io.grpc.netty; package io.grpc.netty;
import static io.grpc.internal.GrpcUtil.AUTHORITY_KEY;
import static io.grpc.internal.GrpcUtil.CONTENT_TYPE_KEY; import static io.grpc.internal.GrpcUtil.CONTENT_TYPE_KEY;
import static io.grpc.internal.GrpcUtil.USER_AGENT_KEY; import static io.grpc.internal.GrpcUtil.USER_AGENT_KEY;
import static io.netty.util.CharsetUtil.UTF_8; import static io.netty.util.CharsetUtil.UTF_8;
@ -79,16 +80,8 @@ class Utils {
public static final Resource<EventLoopGroup> DEFAULT_WORKER_EVENT_LOOP_GROUP = public static final Resource<EventLoopGroup> DEFAULT_WORKER_EVENT_LOOP_GROUP =
new DefaultEventLoopGroupResource(0, "grpc-default-worker-ELG"); new DefaultEventLoopGroupResource(0, "grpc-default-worker-ELG");
public static Metadata.Headers convertHeaders(Http2Headers http2Headers) { public static Metadata convertHeaders(Http2Headers http2Headers) {
Metadata.Headers headers = new Metadata.Headers(convertHeadersToArray(http2Headers)); return new Metadata(convertHeadersToArray(http2Headers));
if (http2Headers.authority() != null) {
// toString() here is safe since it doesn't use the default Charset.
headers.setAuthority(http2Headers.authority().toString());
}
if (http2Headers.path() != null) {
headers.setPath(http2Headers.path().toString());
}
return headers;
} }
private static byte[][] convertHeadersToArray(Http2Headers http2Headers) { private static byte[][] convertHeadersToArray(Http2Headers http2Headers) {
@ -103,7 +96,7 @@ class Utils {
return TransportFrameUtil.toRawSerializedHeaders(headerValues); return TransportFrameUtil.toRawSerializedHeaders(headerValues);
} }
public static Http2Headers convertClientHeaders(Metadata.Headers headers, public static Http2Headers convertClientHeaders(Metadata headers,
ByteString scheme, ByteString scheme,
ByteString defaultPath, ByteString defaultPath,
ByteString defaultAuthority) { ByteString defaultAuthority) {
@ -121,11 +114,8 @@ class Utils {
.set(TE_HEADER, TE_TRAILERS); .set(TE_HEADER, TE_TRAILERS);
// Override the default authority and path if provided by the headers. // Override the default authority and path if provided by the headers.
if (headers.getAuthority() != null) { if (headers.containsKey(AUTHORITY_KEY)) {
http2Headers.authority(new ByteString(headers.getAuthority().getBytes(UTF_8))); http2Headers.authority(new ByteString(headers.get(AUTHORITY_KEY).getBytes(UTF_8)));
}
if (headers.getPath() != null) {
http2Headers.path(new ByteString(headers.getPath().getBytes(UTF_8)));
} }
// Set the User-Agent header. // Set the User-Agent header.
@ -135,7 +125,7 @@ class Utils {
return http2Headers; return http2Headers;
} }
public static Http2Headers convertServerHeaders(Metadata.Headers headers) { public static Http2Headers convertServerHeaders(Metadata headers) {
Http2Headers http2Headers = convertMetadata(headers); Http2Headers http2Headers = convertMetadata(headers);
http2Headers.set(CONTENT_TYPE_HEADER, CONTENT_TYPE_GRPC); http2Headers.set(CONTENT_TYPE_HEADER, CONTENT_TYPE_GRPC);
http2Headers.status(STATUS_OK); http2Headers.status(STATUS_OK);

View File

@ -206,7 +206,7 @@ public class NettyClientStreamTest extends NettyStreamTestBase {
stream().id(STREAM_ID); stream().id(STREAM_ID);
Http2Headers headers = grpcResponseHeaders(); Http2Headers headers = grpcResponseHeaders();
stream().transportHeadersReceived(headers, false); stream().transportHeadersReceived(headers, false);
verify(listener).headersRead(any(Metadata.Headers.class)); verify(listener).headersRead(any(Metadata.class));
} }
@Test @Test

View File

@ -129,7 +129,7 @@ public class NettyClientTransportTest {
// Verify that the received headers contained the User-Agent. // Verify that the received headers contained the User-Agent.
assertEquals(1, serverListener.streamListeners.size()); assertEquals(1, serverListener.streamListeners.size());
Metadata.Headers headers = serverListener.streamListeners.get(0).headers; Metadata headers = serverListener.streamListeners.get(0).headers;
assertEquals(GrpcUtil.getGrpcUserAgent("netty", null), headers.get(USER_AGENT_KEY)); assertEquals(GrpcUtil.getGrpcUserAgent("netty", null), headers.get(USER_AGENT_KEY));
} }
@ -141,13 +141,13 @@ public class NettyClientTransportTest {
// Send a single RPC and wait for the response. // Send a single RPC and wait for the response.
String userAgent = "testUserAgent"; String userAgent = "testUserAgent";
Metadata.Headers sentHeaders = new Metadata.Headers(); Metadata sentHeaders = new Metadata();
sentHeaders.put(USER_AGENT_KEY, userAgent); sentHeaders.put(USER_AGENT_KEY, userAgent);
new Rpc(transport, sentHeaders).halfClose().waitForResponse(); new Rpc(transport, sentHeaders).halfClose().waitForResponse();
// Verify that the received headers contained the User-Agent. // Verify that the received headers contained the User-Agent.
assertEquals(1, serverListener.streamListeners.size()); assertEquals(1, serverListener.streamListeners.size());
Metadata.Headers receivedHeaders = serverListener.streamListeners.get(0).headers; Metadata receivedHeaders = serverListener.streamListeners.get(0).headers;
assertEquals(GrpcUtil.getGrpcUserAgent("netty", userAgent), assertEquals(GrpcUtil.getGrpcUserAgent("netty", userAgent),
receivedHeaders.get(USER_AGENT_KEY)); receivedHeaders.get(USER_AGENT_KEY));
} }
@ -249,10 +249,10 @@ public class NettyClientTransportTest {
final TestClientStreamListener listener = new TestClientStreamListener(); final TestClientStreamListener listener = new TestClientStreamListener();
Rpc(NettyClientTransport transport) { Rpc(NettyClientTransport transport) {
this(transport, new Metadata.Headers()); this(transport, new Metadata());
} }
Rpc(NettyClientTransport transport, Metadata.Headers headers) { Rpc(NettyClientTransport transport, Metadata headers) {
stream = transport.newStream(METHOD, headers, listener); stream = transport.newStream(METHOD, headers, listener);
stream.request(1); stream.request(1);
stream.writeMessage(new ByteArrayInputStream(MESSAGE.getBytes())); stream.writeMessage(new ByteArrayInputStream(MESSAGE.getBytes()));
@ -278,7 +278,7 @@ public class NettyClientTransportTest {
private final SettableFuture<Void> responseFuture = SettableFuture.create(); private final SettableFuture<Void> responseFuture = SettableFuture.create();
@Override @Override
public void headersRead(Metadata.Headers headers) { public void headersRead(Metadata headers) {
} }
@Override @Override
@ -305,9 +305,9 @@ public class NettyClientTransportTest {
private static final class EchoServerStreamListener implements ServerStreamListener { private static final class EchoServerStreamListener implements ServerStreamListener {
final ServerStream stream; final ServerStream stream;
final String method; final String method;
final Metadata.Headers headers; final Metadata headers;
EchoServerStreamListener(ServerStream stream, String method, Metadata.Headers headers) { EchoServerStreamListener(ServerStream stream, String method, Metadata headers) {
this.stream = stream; this.stream = stream;
this.method = method; this.method = method;
this.headers = headers; this.headers = headers;
@ -348,7 +348,7 @@ public class NettyClientTransportTest {
@Override @Override
public ServerStreamListener streamCreated(final ServerStream stream, String method, public ServerStreamListener streamCreated(final ServerStream stream, String method,
Metadata.Headers headers) { Metadata headers) {
EchoServerStreamListener listener = new EchoServerStreamListener(stream, method, headers); EchoServerStreamListener listener = new EchoServerStreamListener(stream, method, headers);
streamListeners.add(listener); streamListeners.add(listener);
return listener; return listener;

View File

@ -127,7 +127,7 @@ public class NettyServerHandlerTest extends NettyHandlerTestBase {
when(transportListener.streamCreated(any(ServerStream.class), when(transportListener.streamCreated(any(ServerStream.class),
any(String.class), any(String.class),
any(Metadata.Headers.class))) any(Metadata.class)))
.thenReturn(streamListener); .thenReturn(streamListener);
handler = newHandler(transportListener); handler = newHandler(transportListener);
frameWriter = new DefaultHttp2FrameWriter(); frameWriter = new DefaultHttp2FrameWriter();
@ -358,7 +358,7 @@ public class NettyServerHandlerTest extends NettyHandlerTestBase {
ArgumentCaptor.forClass(NettyServerStream.class); ArgumentCaptor.forClass(NettyServerStream.class);
ArgumentCaptor<String> methodCaptor = ArgumentCaptor.forClass(String.class); ArgumentCaptor<String> methodCaptor = ArgumentCaptor.forClass(String.class);
verify(transportListener).streamCreated(streamCaptor.capture(), methodCaptor.capture(), verify(transportListener).streamCreated(streamCaptor.capture(), methodCaptor.capture(),
any(Metadata.Headers.class)); any(Metadata.class));
stream = streamCaptor.getValue(); stream = streamCaptor.getValue();
} }

View File

@ -104,7 +104,7 @@ public class NettyServerStreamTest extends NettyStreamTestBase {
@Test @Test
public void writeHeadersShouldSendHeaders() throws Exception { public void writeHeadersShouldSendHeaders() throws Exception {
Metadata.Headers headers = new Metadata.Headers(); Metadata headers = new Metadata();
stream().writeHeaders(headers); stream().writeHeaders(headers);
verify(writeQueue).enqueue(new SendResponseHeadersCommand(STREAM_ID, verify(writeQueue).enqueue(new SendResponseHeadersCommand(STREAM_ID,
Utils.convertServerHeaders(headers), false), true); Utils.convertServerHeaders(headers), false), true);
@ -112,7 +112,7 @@ public class NettyServerStreamTest extends NettyStreamTestBase {
@Test @Test
public void duplicateWriteHeadersShouldFail() throws Exception { public void duplicateWriteHeadersShouldFail() throws Exception {
Metadata.Headers headers = new Metadata.Headers(); Metadata headers = new Metadata();
stream().writeHeaders(headers); stream().writeHeaders(headers);
verify(writeQueue).enqueue(new SendResponseHeadersCommand(STREAM_ID, verify(writeQueue).enqueue(new SendResponseHeadersCommand(STREAM_ID,
Utils.convertServerHeaders(headers), false), true); Utils.convertServerHeaders(headers), false), true);

View File

@ -31,6 +31,7 @@
package io.grpc.okhttp; package io.grpc.okhttp;
import static io.grpc.internal.GrpcUtil.AUTHORITY_KEY;
import static io.grpc.internal.GrpcUtil.CONTENT_TYPE_KEY; import static io.grpc.internal.GrpcUtil.CONTENT_TYPE_KEY;
import static io.grpc.internal.GrpcUtil.USER_AGENT_KEY; import static io.grpc.internal.GrpcUtil.USER_AGENT_KEY;
@ -63,7 +64,7 @@ public class Headers {
* creating a stream. Since this serializes the headers, this method should be called in the * creating a stream. Since this serializes the headers, this method should be called in the
* application thread context. * application thread context.
*/ */
public static List<Header> createRequestHeaders(Metadata.Headers headers, String defaultPath, public static List<Header> createRequestHeaders(Metadata headers, String defaultPath,
String defaultAuthority) { String defaultAuthority) {
Preconditions.checkNotNull(headers, "headers"); Preconditions.checkNotNull(headers, "headers");
Preconditions.checkNotNull(defaultPath, "defaultPath"); Preconditions.checkNotNull(defaultPath, "defaultPath");
@ -74,9 +75,12 @@ public class Headers {
// Set GRPC-specific headers. // Set GRPC-specific headers.
okhttpHeaders.add(SCHEME_HEADER); okhttpHeaders.add(SCHEME_HEADER);
okhttpHeaders.add(METHOD_HEADER); okhttpHeaders.add(METHOD_HEADER);
String authority = headers.getAuthority() != null ? headers.getAuthority() : defaultAuthority;
String authority = headers.containsKey(AUTHORITY_KEY)
? headers.get(AUTHORITY_KEY) : defaultAuthority;
headers.removeAll(AUTHORITY_KEY);
okhttpHeaders.add(new Header(Header.TARGET_AUTHORITY, authority)); okhttpHeaders.add(new Header(Header.TARGET_AUTHORITY, authority));
String path = headers.getPath() != null ? headers.getPath() : defaultPath; String path = defaultPath;
okhttpHeaders.add(new Header(Header.TARGET_PATH, path)); okhttpHeaders.add(new Header(Header.TARGET_PATH, path));
String userAgent = GrpcUtil.getGrpcUserAgent("okhttp", headers.get(USER_AGENT_KEY)); String userAgent = GrpcUtil.getGrpcUserAgent("okhttp", headers.get(USER_AGENT_KEY));

View File

@ -241,7 +241,7 @@ class OkHttpClientTransport implements ClientTransport {
@Override @Override
public OkHttpClientStream newStream(MethodDescriptor<?, ?> method, public OkHttpClientStream newStream(MethodDescriptor<?, ?> method,
Metadata.Headers headers, Metadata headers,
ClientStreamListener listener) { ClientStreamListener listener) {
Preconditions.checkNotNull(method, "method"); Preconditions.checkNotNull(method, "method");
Preconditions.checkNotNull(headers, "headers"); Preconditions.checkNotNull(headers, "headers");

View File

@ -45,8 +45,8 @@ class Utils {
static final int DEFAULT_WINDOW_SIZE = 65535; static final int DEFAULT_WINDOW_SIZE = 65535;
static final int CONNECTION_STREAM_ID = 0; static final int CONNECTION_STREAM_ID = 0;
public static Metadata.Headers convertHeaders(List<Header> http2Headers) { public static Metadata convertHeaders(List<Header> http2Headers) {
return new Metadata.Headers(convertHeadersToArray(http2Headers)); return new Metadata(convertHeadersToArray(http2Headers));
} }
public static Metadata convertTrailers(List<Header> http2Headers) { public static Metadata convertTrailers(List<Header> http2Headers) {

View File

@ -196,8 +196,8 @@ public class OkHttpClientTransportTest {
initTransport(); initTransport();
MockStreamListener listener1 = new MockStreamListener(); MockStreamListener listener1 = new MockStreamListener();
MockStreamListener listener2 = new MockStreamListener(); MockStreamListener listener2 = new MockStreamListener();
clientTransport.newStream(method, new Metadata.Headers(), listener1).request(1); clientTransport.newStream(method, new Metadata(), listener1).request(1);
clientTransport.newStream(method, new Metadata.Headers(), listener2).request(1); clientTransport.newStream(method, new Metadata(), listener2).request(1);
assertEquals(2, activeStreamCount()); assertEquals(2, activeStreamCount());
assertContainStream(3); assertContainStream(3);
assertContainStream(5); assertContainStream(5);
@ -219,7 +219,7 @@ public class OkHttpClientTransportTest {
final int numMessages = 10; final int numMessages = 10;
final String message = "Hello Client"; final String message = "Hello Client";
MockStreamListener listener = new MockStreamListener(); MockStreamListener listener = new MockStreamListener();
clientTransport.newStream(method, new Metadata.Headers(), listener).request(numMessages); clientTransport.newStream(method, new Metadata(), listener).request(numMessages);
assertContainStream(3); assertContainStream(3);
frameHandler().headers(false, false, 3, 0, grpcResponseHeaders(), HeadersMode.HTTP_20_HEADERS); frameHandler().headers(false, false, 3, 0, grpcResponseHeaders(), HeadersMode.HTTP_20_HEADERS);
assertNotNull(listener.headers); assertNotNull(listener.headers);
@ -263,7 +263,7 @@ public class OkHttpClientTransportTest {
public void invalidInboundHeadersCancelStream() throws Exception { public void invalidInboundHeadersCancelStream() throws Exception {
initTransport(); initTransport();
MockStreamListener listener = new MockStreamListener(); MockStreamListener listener = new MockStreamListener();
clientTransport.newStream(method, new Metadata.Headers(), listener).request(1); clientTransport.newStream(method, new Metadata(), listener).request(1);
assertContainStream(3); assertContainStream(3);
// Empty headers block without correct content type or status // Empty headers block without correct content type or status
frameHandler().headers(false, false, 3, 0, new ArrayList<Header>(), frameHandler().headers(false, false, 3, 0, new ArrayList<Header>(),
@ -281,7 +281,7 @@ public class OkHttpClientTransportTest {
public void readStatus() throws Exception { public void readStatus() throws Exception {
initTransport(); initTransport();
MockStreamListener listener = new MockStreamListener(); MockStreamListener listener = new MockStreamListener();
clientTransport.newStream(method, new Metadata.Headers(), listener); clientTransport.newStream(method, new Metadata(), listener);
assertContainStream(3); assertContainStream(3);
frameHandler().headers(true, true, 3, 0, grpcResponseTrailers(), HeadersMode.HTTP_20_HEADERS); frameHandler().headers(true, true, 3, 0, grpcResponseTrailers(), HeadersMode.HTTP_20_HEADERS);
listener.waitUntilStreamClosed(); listener.waitUntilStreamClosed();
@ -292,7 +292,7 @@ public class OkHttpClientTransportTest {
public void receiveReset() throws Exception { public void receiveReset() throws Exception {
initTransport(); initTransport();
MockStreamListener listener = new MockStreamListener(); MockStreamListener listener = new MockStreamListener();
clientTransport.newStream(method, new Metadata.Headers(), listener); clientTransport.newStream(method, new Metadata(), listener);
assertContainStream(3); assertContainStream(3);
frameHandler().rstStream(3, ErrorCode.PROTOCOL_ERROR); frameHandler().rstStream(3, ErrorCode.PROTOCOL_ERROR);
listener.waitUntilStreamClosed(); listener.waitUntilStreamClosed();
@ -303,7 +303,7 @@ public class OkHttpClientTransportTest {
public void cancelStream() throws Exception { public void cancelStream() throws Exception {
initTransport(); initTransport();
MockStreamListener listener = new MockStreamListener(); MockStreamListener listener = new MockStreamListener();
clientTransport.newStream(method, new Metadata.Headers(), listener); clientTransport.newStream(method, new Metadata(), listener);
getStream(3).cancel(Status.CANCELLED); getStream(3).cancel(Status.CANCELLED);
verify(frameWriter, timeout(TIME_OUT_MS)).rstStream(eq(3), eq(ErrorCode.CANCEL)); verify(frameWriter, timeout(TIME_OUT_MS)).rstStream(eq(3), eq(ErrorCode.CANCEL));
listener.waitUntilStreamClosed(); listener.waitUntilStreamClosed();
@ -315,7 +315,7 @@ public class OkHttpClientTransportTest {
public void headersShouldAddDefaultUserAgent() throws Exception { public void headersShouldAddDefaultUserAgent() throws Exception {
initTransport(); initTransport();
MockStreamListener listener = new MockStreamListener(); MockStreamListener listener = new MockStreamListener();
clientTransport.newStream(method, new Metadata.Headers(), listener); clientTransport.newStream(method, new Metadata(), listener);
Header userAgentHeader = new Header(GrpcUtil.USER_AGENT_KEY.name(), Header userAgentHeader = new Header(GrpcUtil.USER_AGENT_KEY.name(),
GrpcUtil.getGrpcUserAgent("okhttp", null)); GrpcUtil.getGrpcUserAgent("okhttp", null));
List<Header> expectedHeaders = Arrays.asList(SCHEME_HEADER, METHOD_HEADER, List<Header> expectedHeaders = Arrays.asList(SCHEME_HEADER, METHOD_HEADER,
@ -332,7 +332,7 @@ public class OkHttpClientTransportTest {
initTransport(); initTransport();
MockStreamListener listener = new MockStreamListener(); MockStreamListener listener = new MockStreamListener();
String userAgent = "fakeUserAgent"; String userAgent = "fakeUserAgent";
Metadata.Headers metadata = new Metadata.Headers(); Metadata metadata = new Metadata();
metadata.put(GrpcUtil.USER_AGENT_KEY, userAgent); metadata.put(GrpcUtil.USER_AGENT_KEY, userAgent);
clientTransport.newStream(method, metadata, listener); clientTransport.newStream(method, metadata, listener);
List<Header> expectedHeaders = Arrays.asList(SCHEME_HEADER, METHOD_HEADER, List<Header> expectedHeaders = Arrays.asList(SCHEME_HEADER, METHOD_HEADER,
@ -350,7 +350,7 @@ public class OkHttpClientTransportTest {
public void cancelStreamForDeadlineExceeded() throws Exception { public void cancelStreamForDeadlineExceeded() throws Exception {
initTransport(); initTransport();
MockStreamListener listener = new MockStreamListener(); MockStreamListener listener = new MockStreamListener();
clientTransport.newStream(method, new Metadata.Headers(), listener); clientTransport.newStream(method, new Metadata(), listener);
getStream(3).cancel(Status.DEADLINE_EXCEEDED); getStream(3).cancel(Status.DEADLINE_EXCEEDED);
verify(frameWriter, timeout(TIME_OUT_MS)).rstStream(eq(3), eq(ErrorCode.CANCEL)); verify(frameWriter, timeout(TIME_OUT_MS)).rstStream(eq(3), eq(ErrorCode.CANCEL));
listener.waitUntilStreamClosed(); listener.waitUntilStreamClosed();
@ -362,7 +362,7 @@ public class OkHttpClientTransportTest {
final String message = "Hello Server"; final String message = "Hello Server";
MockStreamListener listener = new MockStreamListener(); MockStreamListener listener = new MockStreamListener();
OkHttpClientStream stream = OkHttpClientStream stream =
clientTransport.newStream(method, new Metadata.Headers(), listener); clientTransport.newStream(method, new Metadata(), listener);
InputStream input = new ByteArrayInputStream(message.getBytes(UTF_8)); InputStream input = new ByteArrayInputStream(message.getBytes(UTF_8));
assertEquals(12, input.available()); assertEquals(12, input.available());
stream.writeMessage(input); stream.writeMessage(input);
@ -380,8 +380,8 @@ public class OkHttpClientTransportTest {
initTransport(); initTransport();
MockStreamListener listener1 = new MockStreamListener(); MockStreamListener listener1 = new MockStreamListener();
MockStreamListener listener2 = new MockStreamListener(); MockStreamListener listener2 = new MockStreamListener();
clientTransport.newStream(method,new Metadata.Headers(), listener1).request(2); clientTransport.newStream(method,new Metadata(), listener1).request(2);
clientTransport.newStream(method,new Metadata.Headers(), listener2).request(2); clientTransport.newStream(method,new Metadata(), listener2).request(2);
assertEquals(2, activeStreamCount()); assertEquals(2, activeStreamCount());
OkHttpClientStream stream1 = getStream(3); OkHttpClientStream stream1 = getStream(3);
OkHttpClientStream stream2 = getStream(5); OkHttpClientStream stream2 = getStream(5);
@ -438,7 +438,7 @@ public class OkHttpClientTransportTest {
public void windowUpdateWithInboundFlowControl() throws Exception { public void windowUpdateWithInboundFlowControl() throws Exception {
initTransport(); initTransport();
MockStreamListener listener = new MockStreamListener(); MockStreamListener listener = new MockStreamListener();
clientTransport.newStream(method, new Metadata.Headers(), listener).request(1); clientTransport.newStream(method, new Metadata(), listener).request(1);
int messageLength = Utils.DEFAULT_WINDOW_SIZE / 2 + 1; int messageLength = Utils.DEFAULT_WINDOW_SIZE / 2 + 1;
byte[] fakeMessage = new byte[messageLength]; byte[] fakeMessage = new byte[messageLength];
@ -462,7 +462,7 @@ public class OkHttpClientTransportTest {
public void outboundFlowControl() throws Exception { public void outboundFlowControl() throws Exception {
initTransport(); initTransport();
MockStreamListener listener = new MockStreamListener(); MockStreamListener listener = new MockStreamListener();
OkHttpClientStream stream = clientTransport.newStream(method, new Metadata.Headers(), listener); OkHttpClientStream stream = clientTransport.newStream(method, new Metadata(), listener);
// The first message should be sent out. // The first message should be sent out.
int messageLength = Utils.DEFAULT_WINDOW_SIZE / 2 + 1; int messageLength = Utils.DEFAULT_WINDOW_SIZE / 2 + 1;
@ -496,7 +496,7 @@ public class OkHttpClientTransportTest {
public void outboundFlowControlWithInitialWindowSizeChange() throws Exception { public void outboundFlowControlWithInitialWindowSizeChange() throws Exception {
initTransport(); initTransport();
MockStreamListener listener = new MockStreamListener(); MockStreamListener listener = new MockStreamListener();
OkHttpClientStream stream = clientTransport.newStream(method, new Metadata.Headers(), listener); OkHttpClientStream stream = clientTransport.newStream(method, new Metadata(), listener);
int messageLength = 20; int messageLength = 20;
setInitialWindowSize(HEADER_LENGTH + 10); setInitialWindowSize(HEADER_LENGTH + 10);
InputStream input = new ByteArrayInputStream(new byte[messageLength]); InputStream input = new ByteArrayInputStream(new byte[messageLength]);
@ -541,9 +541,9 @@ public class OkHttpClientTransportTest {
MockStreamListener listener1 = new MockStreamListener(); MockStreamListener listener1 = new MockStreamListener();
MockStreamListener listener2 = new MockStreamListener(); MockStreamListener listener2 = new MockStreamListener();
OkHttpClientStream stream1 OkHttpClientStream stream1
= clientTransport.newStream(method, new Metadata.Headers(), listener1); = clientTransport.newStream(method, new Metadata(), listener1);
OkHttpClientStream stream2 OkHttpClientStream stream2
= clientTransport.newStream(method, new Metadata.Headers(), listener2); = clientTransport.newStream(method, new Metadata(), listener2);
assertEquals(2, activeStreamCount()); assertEquals(2, activeStreamCount());
clientTransport.shutdown(); clientTransport.shutdown();
verify(frameWriter, timeout(TIME_OUT_MS)).goAway(eq(0), eq(ErrorCode.NO_ERROR), (byte[]) any()); verify(frameWriter, timeout(TIME_OUT_MS)).goAway(eq(0), eq(ErrorCode.NO_ERROR), (byte[]) any());
@ -567,8 +567,8 @@ public class OkHttpClientTransportTest {
// start 2 streams. // start 2 streams.
MockStreamListener listener1 = new MockStreamListener(); MockStreamListener listener1 = new MockStreamListener();
MockStreamListener listener2 = new MockStreamListener(); MockStreamListener listener2 = new MockStreamListener();
clientTransport.newStream(method,new Metadata.Headers(), listener1).request(1); clientTransport.newStream(method,new Metadata(), listener1).request(1);
clientTransport.newStream(method,new Metadata.Headers(), listener2).request(1); clientTransport.newStream(method,new Metadata(), listener2).request(1);
assertEquals(2, activeStreamCount()); assertEquals(2, activeStreamCount());
// Receive goAway, max good id is 3. // Receive goAway, max good id is 3.
@ -620,7 +620,7 @@ public class OkHttpClientTransportTest {
initTransport(startId); initTransport(startId);
MockStreamListener listener = new MockStreamListener(); MockStreamListener listener = new MockStreamListener();
clientTransport.newStream(method, new Metadata.Headers(), listener).request(1); clientTransport.newStream(method, new Metadata(), listener).request(1);
// New stream should be failed. // New stream should be failed.
assertNewStreamFail(); assertNewStreamFail();
@ -653,11 +653,11 @@ public class OkHttpClientTransportTest {
final MockStreamListener listener1 = new MockStreamListener(); final MockStreamListener listener1 = new MockStreamListener();
final MockStreamListener listener2 = new MockStreamListener(); final MockStreamListener listener2 = new MockStreamListener();
OkHttpClientStream stream1 OkHttpClientStream stream1
= clientTransport.newStream(method, new Metadata.Headers(), listener1); = clientTransport.newStream(method, new Metadata(), listener1);
// The second stream should be pending. // The second stream should be pending.
OkHttpClientStream stream2 = OkHttpClientStream stream2 =
clientTransport.newStream(method, new Metadata.Headers(), listener2); clientTransport.newStream(method, new Metadata(), listener2);
String sentMessage = "hello"; String sentMessage = "hello";
InputStream input = new ByteArrayInputStream(sentMessage.getBytes(UTF_8)); InputStream input = new ByteArrayInputStream(sentMessage.getBytes(UTF_8));
assertEquals(5, input.available()); assertEquals(5, input.available());
@ -690,7 +690,7 @@ public class OkHttpClientTransportTest {
setMaxConcurrentStreams(0); setMaxConcurrentStreams(0);
MockStreamListener listener = new MockStreamListener(); MockStreamListener listener = new MockStreamListener();
OkHttpClientStream stream OkHttpClientStream stream
= clientTransport.newStream(method, new Metadata.Headers(), listener); = clientTransport.newStream(method, new Metadata(), listener);
waitForStreamPending(1); waitForStreamPending(1);
stream.sendCancel(Status.CANCELLED); stream.sendCancel(Status.CANCELLED);
// The second cancel should be an no-op. // The second cancel should be an no-op.
@ -706,9 +706,9 @@ public class OkHttpClientTransportTest {
setMaxConcurrentStreams(1); setMaxConcurrentStreams(1);
final MockStreamListener listener1 = new MockStreamListener(); final MockStreamListener listener1 = new MockStreamListener();
final MockStreamListener listener2 = new MockStreamListener(); final MockStreamListener listener2 = new MockStreamListener();
clientTransport.newStream(method, new Metadata.Headers(), listener1); clientTransport.newStream(method, new Metadata(), listener1);
// The second stream should be pending. // The second stream should be pending.
clientTransport.newStream(method, new Metadata.Headers(), listener2); clientTransport.newStream(method, new Metadata(), listener2);
waitForStreamPending(1); waitForStreamPending(1);
assertEquals(1, activeStreamCount()); assertEquals(1, activeStreamCount());
@ -731,7 +731,7 @@ public class OkHttpClientTransportTest {
setMaxConcurrentStreams(0); setMaxConcurrentStreams(0);
final MockStreamListener listener = new MockStreamListener(); final MockStreamListener listener = new MockStreamListener();
// The second stream should be pending. // The second stream should be pending.
clientTransport.newStream(method, new Metadata.Headers(), listener); clientTransport.newStream(method, new Metadata(), listener);
waitForStreamPending(1); waitForStreamPending(1);
clientTransport.shutdown(); clientTransport.shutdown();
@ -752,11 +752,11 @@ public class OkHttpClientTransportTest {
final MockStreamListener listener3 = new MockStreamListener(); final MockStreamListener listener3 = new MockStreamListener();
OkHttpClientStream stream1 = OkHttpClientStream stream1 =
clientTransport.newStream(method, new Metadata.Headers(), listener1); clientTransport.newStream(method, new Metadata(), listener1);
// The second and third stream should be pending. // The second and third stream should be pending.
clientTransport.newStream(method, new Metadata.Headers(), listener2); clientTransport.newStream(method, new Metadata(), listener2);
clientTransport.newStream(method, new Metadata.Headers(), listener3); clientTransport.newStream(method, new Metadata(), listener3);
waitForStreamPending(2); waitForStreamPending(2);
assertEquals(1, activeStreamCount()); assertEquals(1, activeStreamCount());
@ -777,7 +777,7 @@ public class OkHttpClientTransportTest {
public void receivingWindowExceeded() throws Exception { public void receivingWindowExceeded() throws Exception {
initTransport(); initTransport();
MockStreamListener listener = new MockStreamListener(); MockStreamListener listener = new MockStreamListener();
clientTransport.newStream(method, new Metadata.Headers(), listener).request(1); clientTransport.newStream(method, new Metadata(), listener).request(1);
frameHandler().headers(false, false, 3, 0, grpcResponseHeaders(), HeadersMode.HTTP_20_HEADERS); frameHandler().headers(false, false, 3, 0, grpcResponseHeaders(), HeadersMode.HTTP_20_HEADERS);
@ -821,7 +821,7 @@ public class OkHttpClientTransportTest {
private void shouldHeadersBeFlushed(boolean shouldBeFlushed) throws Exception { private void shouldHeadersBeFlushed(boolean shouldBeFlushed) throws Exception {
initTransport(); initTransport();
OkHttpClientStream stream = clientTransport.newStream( OkHttpClientStream stream = clientTransport.newStream(
method, new Metadata.Headers(), new MockStreamListener()); method, new Metadata(), new MockStreamListener());
verify(frameWriter, timeout(TIME_OUT_MS)).synStream( verify(frameWriter, timeout(TIME_OUT_MS)).synStream(
eq(false), eq(false), eq(3), eq(0), Matchers.anyListOf(Header.class)); eq(false), eq(false), eq(3), eq(0), Matchers.anyListOf(Header.class));
if (shouldBeFlushed) { if (shouldBeFlushed) {
@ -836,7 +836,7 @@ public class OkHttpClientTransportTest {
public void receiveDataWithoutHeader() throws Exception { public void receiveDataWithoutHeader() throws Exception {
initTransport(); initTransport();
MockStreamListener listener = new MockStreamListener(); MockStreamListener listener = new MockStreamListener();
clientTransport.newStream(method,new Metadata.Headers(), listener).request(1); clientTransport.newStream(method,new Metadata(), listener).request(1);
Buffer buffer = createMessageFrame(new byte[1]); Buffer buffer = createMessageFrame(new byte[1]);
frameHandler().data(false, 3, buffer, (int) buffer.size()); frameHandler().data(false, 3, buffer, (int) buffer.size());
@ -854,7 +854,7 @@ public class OkHttpClientTransportTest {
public void receiveDataWithoutHeaderAndTrailer() throws Exception { public void receiveDataWithoutHeaderAndTrailer() throws Exception {
initTransport(); initTransport();
MockStreamListener listener = new MockStreamListener(); MockStreamListener listener = new MockStreamListener();
clientTransport.newStream(method, new Metadata.Headers(), listener).request(1); clientTransport.newStream(method, new Metadata(), listener).request(1);
Buffer buffer = createMessageFrame(new byte[1]); Buffer buffer = createMessageFrame(new byte[1]);
frameHandler().data(false, 3, buffer, (int) buffer.size()); frameHandler().data(false, 3, buffer, (int) buffer.size());
@ -872,7 +872,7 @@ public class OkHttpClientTransportTest {
public void receiveLongEnoughDataWithoutHeaderAndTrailer() throws Exception { public void receiveLongEnoughDataWithoutHeaderAndTrailer() throws Exception {
initTransport(); initTransport();
MockStreamListener listener = new MockStreamListener(); MockStreamListener listener = new MockStreamListener();
clientTransport.newStream(method, new Metadata.Headers(), listener).request(1); clientTransport.newStream(method, new Metadata(), listener).request(1);
Buffer buffer = createMessageFrame(new byte[1000]); Buffer buffer = createMessageFrame(new byte[1000]);
frameHandler().data(false, 3, buffer, (int) buffer.size()); frameHandler().data(false, 3, buffer, (int) buffer.size());
@ -889,7 +889,7 @@ public class OkHttpClientTransportTest {
public void receiveDataForUnknownStreamUpdateConnectionWindow() throws Exception { public void receiveDataForUnknownStreamUpdateConnectionWindow() throws Exception {
initTransport(); initTransport();
MockStreamListener listener = new MockStreamListener(); MockStreamListener listener = new MockStreamListener();
OkHttpClientStream stream = clientTransport.newStream(method, new Metadata.Headers(), listener); OkHttpClientStream stream = clientTransport.newStream(method, new Metadata(), listener);
stream.cancel(Status.CANCELLED); stream.cancel(Status.CANCELLED);
Buffer buffer = createMessageFrame( Buffer buffer = createMessageFrame(
@ -913,7 +913,7 @@ public class OkHttpClientTransportTest {
public void receiveWindowUpdateForUnknownStream() throws Exception { public void receiveWindowUpdateForUnknownStream() throws Exception {
initTransport(); initTransport();
MockStreamListener listener = new MockStreamListener(); MockStreamListener listener = new MockStreamListener();
OkHttpClientStream stream = clientTransport.newStream(method, new Metadata.Headers(), listener); OkHttpClientStream stream = clientTransport.newStream(method, new Metadata(), listener);
stream.cancel(Status.CANCELLED); stream.cancel(Status.CANCELLED);
// This should be ignored. // This should be ignored.
frameHandler().windowUpdate(3, 73); frameHandler().windowUpdate(3, 73);
@ -931,7 +931,7 @@ public class OkHttpClientTransportTest {
initTransport(); initTransport();
MockStreamListener listener = new MockStreamListener(); MockStreamListener listener = new MockStreamListener();
OkHttpClientStream stream = clientTransport.newStream( OkHttpClientStream stream = clientTransport.newStream(
method, new Metadata.Headers(), listener); method, new Metadata(), listener);
assertTrue(stream.isReady()); assertTrue(stream.isReady());
assertTrue(listener.isOnReadyCalled()); assertTrue(listener.isOnReadyCalled());
stream.cancel(Status.CANCELLED); stream.cancel(Status.CANCELLED);
@ -946,7 +946,7 @@ public class OkHttpClientTransportTest {
setInitialWindowSize(0); setInitialWindowSize(0);
MockStreamListener listener = new MockStreamListener(); MockStreamListener listener = new MockStreamListener();
OkHttpClientStream stream = clientTransport.newStream( OkHttpClientStream stream = clientTransport.newStream(
method, new Metadata.Headers(), listener); method, new Metadata(), listener);
assertTrue(stream.isReady()); assertTrue(stream.isReady());
// Be notified at the beginning. // Be notified at the beginning.
assertTrue(listener.isOnReadyCalled()); assertTrue(listener.isOnReadyCalled());
@ -1084,7 +1084,7 @@ public class OkHttpClientTransportTest {
initTransportAndDelayConnected(); initTransportAndDelayConnected();
final String message = "Hello Server"; final String message = "Hello Server";
MockStreamListener listener = new MockStreamListener(); MockStreamListener listener = new MockStreamListener();
OkHttpClientStream stream = clientTransport.newStream(method, new Metadata.Headers(), listener); OkHttpClientStream stream = clientTransport.newStream(method, new Metadata(), listener);
InputStream input = new ByteArrayInputStream(message.getBytes(UTF_8)); InputStream input = new ByteArrayInputStream(message.getBytes(UTF_8));
stream.writeMessage(input); stream.writeMessage(input);
stream.flush(); stream.flush();
@ -1107,7 +1107,7 @@ public class OkHttpClientTransportTest {
initTransportAndDelayConnected(); initTransportAndDelayConnected();
final String message = "Hello Server"; final String message = "Hello Server";
MockStreamListener listener = new MockStreamListener(); MockStreamListener listener = new MockStreamListener();
OkHttpClientStream stream = clientTransport.newStream(method, new Metadata.Headers(), listener); OkHttpClientStream stream = clientTransport.newStream(method, new Metadata(), listener);
InputStream input = new ByteArrayInputStream(message.getBytes(UTF_8)); InputStream input = new ByteArrayInputStream(message.getBytes(UTF_8));
stream.writeMessage(input); stream.writeMessage(input);
stream.flush(); stream.flush();
@ -1122,7 +1122,7 @@ public class OkHttpClientTransportTest {
public void shutdownDuringConnecting() throws Exception { public void shutdownDuringConnecting() throws Exception {
initTransportAndDelayConnected(); initTransportAndDelayConnected();
MockStreamListener listener = new MockStreamListener(); MockStreamListener listener = new MockStreamListener();
clientTransport.newStream(method, new Metadata.Headers(), listener); clientTransport.newStream(method, new Metadata(), listener);
clientTransport.shutdown(); clientTransport.shutdown();
allowTransportConnected(); allowTransportConnected();
@ -1162,7 +1162,7 @@ public class OkHttpClientTransportTest {
private void assertNewStreamFail() throws Exception { private void assertNewStreamFail() throws Exception {
MockStreamListener listener = new MockStreamListener(); MockStreamListener listener = new MockStreamListener();
clientTransport.newStream(method, new Metadata.Headers(), listener); clientTransport.newStream(method, new Metadata(), listener);
listener.waitUntilStreamClosed(); listener.waitUntilStreamClosed();
assertFalse(listener.status.isOk()); assertFalse(listener.status.isOk());
} }
@ -1261,7 +1261,7 @@ public class OkHttpClientTransportTest {
private static class MockStreamListener implements ClientStreamListener { private static class MockStreamListener implements ClientStreamListener {
Status status; Status status;
Metadata.Headers headers; Metadata headers;
Metadata trailers; Metadata trailers;
CountDownLatch closed = new CountDownLatch(1); CountDownLatch closed = new CountDownLatch(1);
ArrayList<String> messages = new ArrayList<String>(); ArrayList<String> messages = new ArrayList<String>();
@ -1271,7 +1271,7 @@ public class OkHttpClientTransportTest {
} }
@Override @Override
public void headersRead(Metadata.Headers headers) { public void headersRead(Metadata headers) {
this.headers = headers; this.headers = headers;
} }

View File

@ -188,7 +188,7 @@ public class ClientCalls {
private static <ReqT, RespT> void startCall(ClientCall<ReqT, RespT> call, private static <ReqT, RespT> void startCall(ClientCall<ReqT, RespT> call,
ClientCall.Listener<RespT> responseListener, boolean streamingResponse) { ClientCall.Listener<RespT> responseListener, boolean streamingResponse) {
call.start(responseListener, new Metadata.Headers()); call.start(responseListener, new Metadata());
if (streamingResponse) { if (streamingResponse) {
call.request(1); call.request(1);
} else { } else {
@ -237,7 +237,7 @@ public class ClientCalls {
} }
@Override @Override
public void onHeaders(Metadata.Headers headers) { public void onHeaders(Metadata headers) {
} }
@Override @Override
@ -278,7 +278,7 @@ public class ClientCalls {
} }
@Override @Override
public void onHeaders(Metadata.Headers headers) { public void onHeaders(Metadata headers) {
} }
@Override @Override
@ -393,7 +393,7 @@ public class ClientCalls {
private boolean done = false; private boolean done = false;
@Override @Override
public void onHeaders(Metadata.Headers headers) { public void onHeaders(Metadata headers) {
} }
@Override @Override

View File

@ -58,7 +58,7 @@ public class MetadataUtils {
@SuppressWarnings({"unchecked", "rawtypes"}) @SuppressWarnings({"unchecked", "rawtypes"})
public static <T extends AbstractStub> T attachHeaders( public static <T extends AbstractStub> T attachHeaders(
T stub, T stub,
final Metadata.Headers extraHeaders) { final Metadata extraHeaders) {
return (T) stub.withInterceptors(newAttachHeadersInterceptor(extraHeaders)); return (T) stub.withInterceptors(newAttachHeadersInterceptor(extraHeaders));
} }
@ -68,7 +68,7 @@ public class MetadataUtils {
* @param extraHeaders the headers to be passed by each call that is processed by the returned * @param extraHeaders the headers to be passed by each call that is processed by the returned
* interceptor * interceptor
*/ */
public static ClientInterceptor newAttachHeadersInterceptor(final Metadata.Headers extraHeaders) { public static ClientInterceptor newAttachHeadersInterceptor(final Metadata extraHeaders) {
return new ClientInterceptor() { return new ClientInterceptor() {
@Override @Override
public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall( public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(
@ -77,7 +77,7 @@ public class MetadataUtils {
Channel next) { Channel next) {
return new SimpleForwardingClientCall<ReqT, RespT>(next.newCall(method, callOptions)) { return new SimpleForwardingClientCall<ReqT, RespT>(next.newCall(method, callOptions)) {
@Override @Override
public void start(Listener<RespT> responseListener, Metadata.Headers headers) { public void start(Listener<RespT> responseListener, Metadata headers) {
headers.merge(extraHeaders); headers.merge(extraHeaders);
super.start(responseListener, headers); super.start(responseListener, headers);
} }
@ -97,7 +97,7 @@ public class MetadataUtils {
@SuppressWarnings({"unchecked", "rawtypes"}) @SuppressWarnings({"unchecked", "rawtypes"})
public static <T extends AbstractStub> T captureMetadata( public static <T extends AbstractStub> T captureMetadata(
T stub, T stub,
AtomicReference<Metadata.Headers> headersCapture, AtomicReference<Metadata> headersCapture,
AtomicReference<Metadata> trailersCapture) { AtomicReference<Metadata> trailersCapture) {
return (T) stub.withInterceptors( return (T) stub.withInterceptors(
newCaptureMetadataInterceptor(headersCapture, trailersCapture)); newCaptureMetadataInterceptor(headersCapture, trailersCapture));
@ -111,7 +111,7 @@ public class MetadataUtils {
* @return an implementation of the channel with captures installed. * @return an implementation of the channel with captures installed.
*/ */
public static ClientInterceptor newCaptureMetadataInterceptor( public static ClientInterceptor newCaptureMetadataInterceptor(
final AtomicReference<Metadata.Headers> headersCapture, final AtomicReference<Metadata> headersCapture,
final AtomicReference<Metadata> trailersCapture) { final AtomicReference<Metadata> trailersCapture) {
return new ClientInterceptor() { return new ClientInterceptor() {
@Override @Override
@ -121,12 +121,12 @@ public class MetadataUtils {
Channel next) { Channel next) {
return new SimpleForwardingClientCall<ReqT, RespT>(next.newCall(method, callOptions)) { return new SimpleForwardingClientCall<ReqT, RespT>(next.newCall(method, callOptions)) {
@Override @Override
public void start(Listener<RespT> responseListener, Metadata.Headers headers) { public void start(Listener<RespT> responseListener, Metadata headers) {
headersCapture.set(null); headersCapture.set(null);
trailersCapture.set(null); trailersCapture.set(null);
super.start(new SimpleForwardingClientCallListener<RespT>(responseListener) { super.start(new SimpleForwardingClientCallListener<RespT>(responseListener) {
@Override @Override
public void onHeaders(Metadata.Headers headers) { public void onHeaders(Metadata headers) {
headersCapture.set(headers); headersCapture.set(headers);
super.onHeaders(headers); super.onHeaders(headers);
} }

View File

@ -125,7 +125,7 @@ public class ServerCalls {
public ServerCall.Listener<ReqT> startCall( public ServerCall.Listener<ReqT> startCall(
MethodDescriptor<ReqT, RespT> methodDescriptor, MethodDescriptor<ReqT, RespT> methodDescriptor,
final ServerCall<RespT> call, final ServerCall<RespT> call,
Metadata.Headers headers) { Metadata headers) {
final ResponseObserver<RespT> responseObserver = new ResponseObserver<RespT>(call); final ResponseObserver<RespT> responseObserver = new ResponseObserver<RespT>(call);
// We expect only 1 request, but we ask for 2 requests here so that if a misbehaving client // We expect only 1 request, but we ask for 2 requests here so that if a misbehaving client
// sends more than 1 requests, we will catch it in onMessage() and emit INVALID_ARGUMENT. // sends more than 1 requests, we will catch it in onMessage() and emit INVALID_ARGUMENT.
@ -177,7 +177,7 @@ public class ServerCalls {
public ServerCall.Listener<ReqT> startCall( public ServerCall.Listener<ReqT> startCall(
MethodDescriptor<ReqT, RespT> methodDescriptor, MethodDescriptor<ReqT, RespT> methodDescriptor,
final ServerCall<RespT> call, final ServerCall<RespT> call,
Metadata.Headers headers) { Metadata headers) {
call.request(1); call.request(1);
final ResponseObserver<RespT> responseObserver = new ResponseObserver<RespT>(call); final ResponseObserver<RespT> responseObserver = new ResponseObserver<RespT>(call);
final StreamObserver<ReqT> requestObserver = method.invoke(responseObserver); final StreamObserver<ReqT> requestObserver = method.invoke(responseObserver);

View File

@ -69,7 +69,7 @@ public class ClientCallsTest {
Integer req = 2; Integer req = 2;
ListenableFuture<String> future = ClientCalls.futureUnaryCall(call, req); ListenableFuture<String> future = ClientCalls.futureUnaryCall(call, req);
ArgumentCaptor<ClientCall.Listener<String>> listenerCaptor = ArgumentCaptor.forClass(null); ArgumentCaptor<ClientCall.Listener<String>> listenerCaptor = ArgumentCaptor.forClass(null);
verify(call).start(listenerCaptor.capture(), any(Metadata.Headers.class)); verify(call).start(listenerCaptor.capture(), any(Metadata.class));
ClientCall.Listener<String> listener = listenerCaptor.getValue(); ClientCall.Listener<String> listener = listenerCaptor.getValue();
verify(call).sendMessage(req); verify(call).sendMessage(req);
verify(call).halfClose(); verify(call).halfClose();
@ -82,7 +82,7 @@ public class ClientCallsTest {
Integer req = 2; Integer req = 2;
ListenableFuture<String> future = ClientCalls.futureUnaryCall(call, req); ListenableFuture<String> future = ClientCalls.futureUnaryCall(call, req);
ArgumentCaptor<ClientCall.Listener<String>> listenerCaptor = ArgumentCaptor.forClass(null); ArgumentCaptor<ClientCall.Listener<String>> listenerCaptor = ArgumentCaptor.forClass(null);
verify(call).start(listenerCaptor.capture(), any(Metadata.Headers.class)); verify(call).start(listenerCaptor.capture(), any(Metadata.class));
ClientCall.Listener<String> listener = listenerCaptor.getValue(); ClientCall.Listener<String> listener = listenerCaptor.getValue();
listener.onClose(Status.INVALID_ARGUMENT, new Metadata()); listener.onClose(Status.INVALID_ARGUMENT, new Metadata());
try { try {
@ -98,7 +98,7 @@ public class ClientCallsTest {
Integer req = 2; Integer req = 2;
ListenableFuture<String> future = ClientCalls.futureUnaryCall(call, req); ListenableFuture<String> future = ClientCalls.futureUnaryCall(call, req);
ArgumentCaptor<ClientCall.Listener<String>> listenerCaptor = ArgumentCaptor.forClass(null); ArgumentCaptor<ClientCall.Listener<String>> listenerCaptor = ArgumentCaptor.forClass(null);
verify(call).start(listenerCaptor.capture(), any(Metadata.Headers.class)); verify(call).start(listenerCaptor.capture(), any(Metadata.class));
ClientCall.Listener<String> listener = listenerCaptor.getValue(); ClientCall.Listener<String> listener = listenerCaptor.getValue();
future.cancel(true); future.cancel(true);
verify(call).cancel(); verify(call).cancel();

View File

@ -84,14 +84,14 @@ public class TestUtils {
public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall( public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(
MethodDescriptor<ReqT, RespT> method, MethodDescriptor<ReqT, RespT> method,
ServerCall<RespT> call, ServerCall<RespT> call,
final Metadata.Headers requestHeaders, final Metadata requestHeaders,
ServerCallHandler<ReqT, RespT> next) { ServerCallHandler<ReqT, RespT> next) {
return next.startCall(method, return next.startCall(method,
new SimpleForwardingServerCall<RespT>(call) { new SimpleForwardingServerCall<RespT>(call) {
boolean sentHeaders; boolean sentHeaders;
@Override @Override
public void sendHeaders(Metadata.Headers responseHeaders) { public void sendHeaders(Metadata responseHeaders) {
responseHeaders.merge(requestHeaders, keySet); responseHeaders.merge(requestHeaders, keySet);
super.sendHeaders(responseHeaders); super.sendHeaders(responseHeaders);
sentHeaders = true; sentHeaders = true;
@ -100,7 +100,7 @@ public class TestUtils {
@Override @Override
public void sendMessage(RespT message) { public void sendMessage(RespT message) {
if (!sentHeaders) { if (!sentHeaders) {
sendHeaders(new Metadata.Headers()); sendHeaders(new Metadata());
} }
super.sendMessage(message); super.sendMessage(message);
} }
@ -121,13 +121,13 @@ public class TestUtils {
* {@link #echoRequestHeadersInterceptor}. * {@link #echoRequestHeadersInterceptor}.
*/ */
public static ServerInterceptor recordRequestHeadersInterceptor( public static ServerInterceptor recordRequestHeadersInterceptor(
final AtomicReference<Metadata.Headers> headersCapture) { final AtomicReference<Metadata> headersCapture) {
return new ServerInterceptor() { return new ServerInterceptor() {
@Override @Override
public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall( public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(
MethodDescriptor<ReqT, RespT> method, MethodDescriptor<ReqT, RespT> method,
ServerCall<RespT> call, ServerCall<RespT> call,
Metadata.Headers requestHeaders, Metadata requestHeaders,
ServerCallHandler<ReqT, RespT> next) { ServerCallHandler<ReqT, RespT> next) {
headersCapture.set(requestHeaders); headersCapture.set(requestHeaders);
return next.startCall(method, call, requestHeaders); return next.startCall(method, call, requestHeaders);