diff --git a/src/main/java/com/google/devtools/build/lib/remote/SimpleBlobStoreFactory.java b/src/main/java/com/google/devtools/build/lib/remote/SimpleBlobStoreFactory.java
index f7bed3c..b4cbadd 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/SimpleBlobStoreFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/SimpleBlobStoreFactory.java
@@ -17,6 +17,7 @@
 import com.google.auth.Credentials;
 import com.google.common.base.Ascii;
 import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.remote.blobstore.CombinedDiskHttpBlobStore;
 import com.google.devtools.build.lib.remote.blobstore.ConcurrentMapBlobStore;
 import com.google.devtools.build.lib.remote.blobstore.OnDiskBlobStore;
@@ -88,13 +89,18 @@
               uri,
               options.remoteTimeout,
               options.remoteMaxConnections,
+              ImmutableList.copyOf(options.remoteHeaders),
               creds);
         } else {
           throw new Exception("Remote cache proxy unsupported: " + options.remoteProxy);
         }
       } else {
         return HttpBlobStore.create(
-            uri, options.remoteTimeout, options.remoteMaxConnections, creds);
+            uri,
+            options.remoteTimeout,
+            options.remoteMaxConnections,
+            ImmutableList.copyOf(options.remoteHeaders),
+            creds);
       }
     } catch (Exception e) {
       throw new RuntimeException(e);
diff --git a/src/main/java/com/google/devtools/build/lib/remote/blobstore/http/AbstractHttpHandler.java b/src/main/java/com/google/devtools/build/lib/remote/blobstore/http/AbstractHttpHandler.java
index 67d2d71..6b061cb 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/blobstore/http/AbstractHttpHandler.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/blobstore/http/AbstractHttpHandler.java
@@ -15,6 +15,7 @@
 
 import com.google.auth.Credentials;
 import com.google.common.base.Charsets;
+import com.google.common.collect.ImmutableList;
 import com.google.common.io.BaseEncoding;
 import com.google.devtools.build.lib.analysis.BlazeVersionInfo;
 import io.netty.channel.ChannelHandlerContext;
@@ -30,6 +31,7 @@
 import java.nio.channels.ClosedChannelException;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 
 /** Common functionality shared by concrete classes. */
 abstract class AbstractHttpHandler<T extends HttpObject> extends SimpleChannelInboundHandler<T>
@@ -39,9 +41,12 @@
       "bazel/" + BlazeVersionInfo.instance().getVersion();
 
   private final Credentials credentials;
+  private final ImmutableList<Entry<String, String>> extraHttpHeaders;
 
-  public AbstractHttpHandler(Credentials credentials) {
+  public AbstractHttpHandler(
+      Credentials credentials, ImmutableList<Entry<String, String>> extraHttpHeaders) {
     this.credentials = credentials;
+    this.extraHttpHeaders = extraHttpHeaders;
   }
 
   protected ChannelPromise userPromise;
@@ -54,8 +59,8 @@
     userPromise = null;
   }
 
-  @SuppressWarnings("FutureReturnValueIgnored") 
-  protected void succeedAndResetUserPromise() {  
+  @SuppressWarnings("FutureReturnValueIgnored")
+  protected void succeedAndResetUserPromise() {
     userPromise.setSuccess();
     userPromise = null;
   }
@@ -82,6 +87,12 @@
     }
   }
 
+  protected void addExtraRemoteHeaders(HttpRequest request) {
+    for (Map.Entry<String, String> header : extraHttpHeaders) {
+      request.headers().add(header.getKey(), header.getValue());
+    }
+  }
+
   protected void addUserAgentHeader(HttpRequest request) {
     request.headers().set(HttpHeaderNames.USER_AGENT, USER_AGENT_VALUE);
   }
diff --git a/src/main/java/com/google/devtools/build/lib/remote/blobstore/http/HttpBlobStore.java b/src/main/java/com/google/devtools/build/lib/remote/blobstore/http/HttpBlobStore.java
index 09c0979..a68d424 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/blobstore/http/HttpBlobStore.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/blobstore/http/HttpBlobStore.java
@@ -15,6 +15,7 @@
 
 
 import com.google.auth.Credentials;
+import com.google.common.collect.ImmutableList;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.SettableFuture;
 import com.google.devtools.build.lib.remote.blobstore.SimpleBlobStore;
@@ -65,6 +66,7 @@
 import java.net.SocketAddress;
 import java.net.URI;
 import java.util.List;
+import java.util.Map.Entry;
 import java.util.NoSuchElementException;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
@@ -107,6 +109,7 @@
   private final ChannelPool channelPool;
   private final URI uri;
   private final int timeoutSeconds;
+  private final ImmutableList<Entry<String, String>> extraHttpHeaders;
   private final boolean useTls;
 
   private final Object closeLock = new Object();
@@ -123,7 +126,11 @@
   private long lastRefreshTime;
 
   public static HttpBlobStore create(
-      URI uri, int timeoutSeconds, int remoteMaxConnections, @Nullable final Credentials creds)
+      URI uri,
+      int timeoutSeconds,
+      int remoteMaxConnections,
+      ImmutableList<Entry<String, String>> extraHttpHeaders,
+      @Nullable final Credentials creds)
       throws Exception {
     return new HttpBlobStore(
         NioEventLoopGroup::new,
@@ -131,6 +138,7 @@
         uri,
         timeoutSeconds,
         remoteMaxConnections,
+        extraHttpHeaders,
         creds,
         null);
   }
@@ -140,6 +148,7 @@
       URI uri,
       int timeoutSeconds,
       int remoteMaxConnections,
+      ImmutableList<Entry<String, String>> extraHttpHeaders,
       @Nullable final Credentials creds)
       throws Exception {
 
@@ -150,6 +159,7 @@
           uri,
           timeoutSeconds,
           remoteMaxConnections,
+          extraHttpHeaders,
           creds,
           domainSocketAddress);
     } else if (Epoll.isAvailable()) {
@@ -159,6 +169,7 @@
           uri,
           timeoutSeconds,
           remoteMaxConnections,
+          extraHttpHeaders,
           creds,
           domainSocketAddress);
     } else {
@@ -172,6 +183,7 @@
       URI uri,
       int timeoutSeconds,
       int remoteMaxConnections,
+      ImmutableList<Entry<String, String>> extraHttpHeaders,
       @Nullable final Credentials creds,
       @Nullable SocketAddress socketAddress)
       throws Exception {
@@ -237,6 +249,7 @@
     }
     this.creds = creds;
     this.timeoutSeconds = timeoutSeconds;
+    this.extraHttpHeaders = extraHttpHeaders;
   }
 
   @SuppressWarnings("FutureReturnValueIgnored")
@@ -271,7 +284,7 @@
                 p.addLast(new HttpRequestEncoder());
                 p.addLast(new ChunkedWriteHandler());
                 synchronized (credentialsLock) {
-                  p.addLast(new HttpUploadHandler(creds));
+                  p.addLast(new HttpUploadHandler(creds, extraHttpHeaders));
                 }
 
                 if (!ch.eventLoop().inEventLoop()) {
@@ -343,7 +356,7 @@
                     new IdleTimeoutHandler(timeoutSeconds, ReadTimeoutException.INSTANCE));
                 p.addLast(new HttpClientCodec());
                 synchronized (credentialsLock) {
-                  p.addLast(new HttpDownloadHandler(creds));
+                  p.addLast(new HttpDownloadHandler(creds, extraHttpHeaders));
                 }
 
                 if (!ch.eventLoop().inEventLoop()) {
diff --git a/src/main/java/com/google/devtools/build/lib/remote/blobstore/http/HttpDownloadHandler.java b/src/main/java/com/google/devtools/build/lib/remote/blobstore/http/HttpDownloadHandler.java
index 44597f1..ffcad78 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/blobstore/http/HttpDownloadHandler.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/blobstore/http/HttpDownloadHandler.java
@@ -16,6 +16,7 @@
 import static com.google.common.base.Preconditions.checkState;
 
 import com.google.auth.Credentials;
+import com.google.common.collect.ImmutableList;
 import io.netty.buffer.ByteBuf;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.ChannelPromise;
@@ -36,6 +37,7 @@
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
+import java.util.Map.Entry;
 
 /** ChannelHandler for downloads. */
 final class HttpDownloadHandler extends AbstractHttpHandler<HttpObject> {
@@ -50,8 +52,9 @@
   /** the path header in the http request */
   private String path;
 
-  public HttpDownloadHandler(Credentials credentials) {
-    super(credentials);
+  public HttpDownloadHandler(
+      Credentials credentials, ImmutableList<Entry<String, String>> extraHttpHeaders) {
+    super(credentials, extraHttpHeaders);
   }
 
   @Override
@@ -136,6 +139,7 @@
     path = constructPath(cmd.uri(), cmd.hash(), cmd.casDownload());
     HttpRequest request = buildRequest(path, constructHost(cmd.uri()));
     addCredentialHeaders(request, cmd.uri());
+    addExtraRemoteHeaders(request);
     addUserAgentHeader(request);
     ctx.writeAndFlush(request)
         .addListener(
diff --git a/src/main/java/com/google/devtools/build/lib/remote/blobstore/http/HttpUploadHandler.java b/src/main/java/com/google/devtools/build/lib/remote/blobstore/http/HttpUploadHandler.java
index 78f761f..c686b3b 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/blobstore/http/HttpUploadHandler.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/blobstore/http/HttpUploadHandler.java
@@ -16,6 +16,7 @@
 import static com.google.common.base.Preconditions.checkState;
 
 import com.google.auth.Credentials;
+import com.google.common.collect.ImmutableList;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.ChannelPromise;
 import io.netty.handler.codec.http.DefaultHttpRequest;
@@ -32,6 +33,7 @@
 import io.netty.handler.timeout.WriteTimeoutException;
 import io.netty.util.internal.StringUtil;
 import java.io.IOException;
+import java.util.Map.Entry;
 
 /** ChannelHandler for uploads. */
 final class HttpUploadHandler extends AbstractHttpHandler<FullHttpResponse> {
@@ -41,8 +43,9 @@
   /** the size of the data being uploaded in bytes */
   private long contentLength;
 
-  public HttpUploadHandler(Credentials credentials) {
-    super(credentials);
+  public HttpUploadHandler(
+      Credentials credentials, ImmutableList<Entry<String, String>> extraHttpHeaders) {
+    super(credentials, extraHttpHeaders);
   }
 
   @SuppressWarnings("FutureReturnValueIgnored")
@@ -92,6 +95,7 @@
     contentLength = cmd.contentLength();
     HttpRequest request = buildRequest(path, constructHost(cmd.uri()), contentLength);
     addCredentialHeaders(request, cmd.uri());
+    addExtraRemoteHeaders(request);
     addUserAgentHeader(request);
     HttpChunkedInput body = buildBody(cmd);
     ctx.writeAndFlush(request)
diff --git a/src/main/java/com/google/devtools/build/lib/remote/options/RemoteOptions.java b/src/main/java/com/google/devtools/build/lib/remote/options/RemoteOptions.java
index f414bc3..a7bf4c8 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/options/RemoteOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/options/RemoteOptions.java
@@ -17,12 +17,15 @@
 import com.google.common.base.Strings;
 import com.google.devtools.build.lib.util.OptionsUtils;
 import com.google.devtools.build.lib.vfs.PathFragment;
+import com.google.devtools.common.options.Converters;
 import com.google.devtools.common.options.EnumConverter;
 import com.google.devtools.common.options.Option;
 import com.google.devtools.common.options.OptionDocumentationCategory;
 import com.google.devtools.common.options.OptionEffectTag;
 import com.google.devtools.common.options.OptionMetadataTag;
 import com.google.devtools.common.options.OptionsBase;
+import java.util.List;
+import java.util.Map.Entry;
 
 /** Options for remote execution and distributed caching. */
 public final class RemoteOptions extends OptionsBase {
@@ -70,6 +73,20 @@
   public String remoteCache;
 
   @Option(
+      name = "remote_header",
+      converter = Converters.AssignmentConverter.class,
+      defaultValue = "",
+      documentationCategory = OptionDocumentationCategory.REMOTE,
+      effectTags = {OptionEffectTag.UNKNOWN},
+      help =
+          "Specify a HTTP header that will be included in requests: --remote_header=Name=Value. "
+              + "Multiple headers can be passed by specifying the flag multiple times. Multiple "
+              + "values for the same name will be converted to a comma-separated list. This flag"
+              + "is currently only implemented for the HTTP protocol.",
+      allowMultiple = true)
+  public List<Entry<String, String>> remoteHeaders;
+
+  @Option(
       name = "remote_timeout",
       defaultValue = "60",
       documentationCategory = OptionDocumentationCategory.REMOTE,
diff --git a/src/test/java/com/google/devtools/build/lib/remote/blobstore/http/AbstractHttpHandlerTest.java b/src/test/java/com/google/devtools/build/lib/remote/blobstore/http/AbstractHttpHandlerTest.java
index 542a5f6..67a4349 100644
--- a/src/test/java/com/google/devtools/build/lib/remote/blobstore/http/AbstractHttpHandlerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/remote/blobstore/http/AbstractHttpHandlerTest.java
@@ -16,12 +16,16 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Maps;
 import io.netty.channel.ChannelPromise;
 import io.netty.channel.embedded.EmbeddedChannel;
 import io.netty.handler.codec.http.HttpHeaderNames;
 import io.netty.handler.codec.http.HttpRequest;
 import java.io.ByteArrayOutputStream;
 import java.net.URI;
+import java.util.Arrays;
+import java.util.Map.Entry;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -34,7 +38,7 @@
   @Test
   public void basicAuthShouldWork() throws Exception {
     URI uri = new URI("http://user:password@does.not.exist/foo");
-    EmbeddedChannel ch = new EmbeddedChannel(new HttpDownloadHandler(null));
+    EmbeddedChannel ch = new EmbeddedChannel(new HttpDownloadHandler(null, ImmutableList.of()));
     ByteArrayOutputStream out = Mockito.spy(new ByteArrayOutputStream());
     DownloadCommand cmd = new DownloadCommand(uri, true, "abcdef", new ByteArrayOutputStream());
     ChannelPromise writePromise = ch.newPromise();
@@ -48,7 +52,7 @@
   @Test
   public void basicAuthShouldNotEnabled() throws Exception {
     URI uri = new URI("http://does.not.exist/foo");
-    EmbeddedChannel ch = new EmbeddedChannel(new HttpDownloadHandler(null));
+    EmbeddedChannel ch = new EmbeddedChannel(new HttpDownloadHandler(null, ImmutableList.of()));
     ByteArrayOutputStream out = Mockito.spy(new ByteArrayOutputStream());
     DownloadCommand cmd = new DownloadCommand(uri, true, "abcdef", new ByteArrayOutputStream());
     ChannelPromise writePromise = ch.newPromise();
@@ -61,7 +65,7 @@
   @Test
   public void hostDoesntIncludePortHttp() throws Exception {
     URI uri = new URI("http://does.not.exist/foo");
-    EmbeddedChannel ch = new EmbeddedChannel(new HttpDownloadHandler(null));
+    EmbeddedChannel ch = new EmbeddedChannel(new HttpDownloadHandler(null, ImmutableList.of()));
     ByteArrayOutputStream out = Mockito.spy(new ByteArrayOutputStream());
     DownloadCommand cmd = new DownloadCommand(uri, true, "abcdef", new ByteArrayOutputStream());
     ChannelPromise writePromise = ch.newPromise();
@@ -74,7 +78,7 @@
   @Test
   public void hostDoesntIncludePortHttps() throws Exception {
     URI uri = new URI("https://does.not.exist/foo");
-    EmbeddedChannel ch = new EmbeddedChannel(new HttpDownloadHandler(null));
+    EmbeddedChannel ch = new EmbeddedChannel(new HttpDownloadHandler(null, ImmutableList.of()));
     ByteArrayOutputStream out = Mockito.spy(new ByteArrayOutputStream());
     DownloadCommand cmd = new DownloadCommand(uri, true, "abcdef", new ByteArrayOutputStream());
     ChannelPromise writePromise = ch.newPromise();
@@ -87,7 +91,7 @@
   @Test
   public void hostDoesIncludePort() throws Exception {
     URI uri = new URI("http://does.not.exist:8080/foo");
-    EmbeddedChannel ch = new EmbeddedChannel(new HttpDownloadHandler(null));
+    EmbeddedChannel ch = new EmbeddedChannel(new HttpDownloadHandler(null, ImmutableList.of()));
     ByteArrayOutputStream out = Mockito.spy(new ByteArrayOutputStream());
     DownloadCommand cmd = new DownloadCommand(uri, true, "abcdef", new ByteArrayOutputStream());
     ChannelPromise writePromise = ch.newPromise();
@@ -100,7 +104,8 @@
   @Test
   public void headersDoIncludeUserAgent() throws Exception {
     URI uri = new URI("http://does.not.exist:8080/foo");
-    EmbeddedChannel ch = new EmbeddedChannel(new HttpDownloadHandler(/* credentials= */ null));
+    EmbeddedChannel ch =
+        new EmbeddedChannel(new HttpDownloadHandler(/* credentials= */ null, ImmutableList.of()));
     DownloadCommand cmd =
         new DownloadCommand(
             uri, /* casDownload= */ true, /* hash= */ "abcdef", new ByteArrayOutputStream());
@@ -110,4 +115,43 @@
     HttpRequest request = ch.readOutbound();
     assertThat(request.headers().get(HttpHeaderNames.USER_AGENT)).isEqualTo("bazel/");
   }
+
+  @Test
+  public void extraHeadersAreIncluded() throws Exception {
+    URI uri = new URI("http://does.not.exist:8080/foo");
+    ImmutableList<Entry<String, String>> remoteHeaders =
+        ImmutableList.of(
+            Maps.immutableEntry("key1", "value1"), Maps.immutableEntry("key2", "value2"));
+
+    EmbeddedChannel ch =
+        new EmbeddedChannel(new HttpDownloadHandler(/* credentials= */ null, remoteHeaders));
+    DownloadCommand cmd =
+        new DownloadCommand(
+            uri, /* casDownload= */ true, /* hash= */ "abcdef", new ByteArrayOutputStream());
+    ChannelPromise writePromise = ch.newPromise();
+    ch.writeOneOutbound(cmd, writePromise);
+
+    HttpRequest request = ch.readOutbound();
+    assertThat(request.headers().get("key1")).isEqualTo("value1");
+    assertThat(request.headers().get("key2")).isEqualTo("value2");
+  }
+
+  @Test
+  public void multipleExtraHeadersAreSupported() throws Exception {
+    URI uri = new URI("http://does.not.exist:8080/foo");
+    ImmutableList<Entry<String, String>> remoteHeaders =
+        ImmutableList.of(
+            Maps.immutableEntry("key", "value1"), Maps.immutableEntry("key", "value2"));
+
+    EmbeddedChannel ch =
+        new EmbeddedChannel(new HttpDownloadHandler(/* credentials= */ null, remoteHeaders));
+    DownloadCommand cmd =
+        new DownloadCommand(
+            uri, /* casDownload= */ true, /* hash= */ "abcdef", new ByteArrayOutputStream());
+    ChannelPromise writePromise = ch.newPromise();
+    ch.writeOneOutbound(cmd, writePromise);
+
+    HttpRequest request = ch.readOutbound();
+    assertThat(request.headers().getAll("key")).isEqualTo(Arrays.asList("value1", "value2"));
+  }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/remote/blobstore/http/HttpBlobStoreTest.java b/src/test/java/com/google/devtools/build/lib/remote/blobstore/http/HttpBlobStoreTest.java
index c45548e..370d5ff 100644
--- a/src/test/java/com/google/devtools/build/lib/remote/blobstore/http/HttpBlobStoreTest.java
+++ b/src/test/java/com/google/devtools/build/lib/remote/blobstore/http/HttpBlobStoreTest.java
@@ -29,6 +29,7 @@
 import com.google.api.client.util.Preconditions;
 import com.google.auth.Credentials;
 import com.google.common.base.Charsets;
+import com.google.common.collect.ImmutableList;
 import io.netty.bootstrap.ServerBootstrap;
 import io.netty.buffer.ByteBuf;
 import io.netty.channel.Channel;
@@ -245,11 +246,17 @@
       DomainSocketAddress domainSocketAddress = (DomainSocketAddress) socketAddress;
       URI uri = new URI("http://localhost");
       return HttpBlobStore.create(
-          domainSocketAddress, uri, timeoutSeconds, /* remoteMaxConnections= */ 0, creds);
+          domainSocketAddress,
+          uri,
+          timeoutSeconds,
+          /* remoteMaxConnections= */ 0,
+          ImmutableList.of(),
+          creds);
     } else if (socketAddress instanceof InetSocketAddress) {
       InetSocketAddress inetSocketAddress = (InetSocketAddress) socketAddress;
       URI uri = new URI("http://localhost:" + inetSocketAddress.getPort());
-      return HttpBlobStore.create(uri, timeoutSeconds, /* remoteMaxConnections= */ 0, creds);
+      return HttpBlobStore.create(
+          uri, timeoutSeconds, /* remoteMaxConnections= */ 0, ImmutableList.of(), creds);
     } else {
       throw new IllegalStateException(
           "unsupported socket address class " + socketAddress.getClass());
diff --git a/src/test/java/com/google/devtools/build/lib/remote/blobstore/http/HttpDownloadHandlerTest.java b/src/test/java/com/google/devtools/build/lib/remote/blobstore/http/HttpDownloadHandlerTest.java
index 4cd3a9ac..74ff960 100644
--- a/src/test/java/com/google/devtools/build/lib/remote/blobstore/http/HttpDownloadHandlerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/remote/blobstore/http/HttpDownloadHandlerTest.java
@@ -17,6 +17,7 @@
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.net.HttpHeaders;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufUtil;
@@ -54,7 +55,7 @@
    */
   @Test
   public void downloadShouldWork() throws IOException {
-    EmbeddedChannel ch = new EmbeddedChannel(new HttpDownloadHandler(null));
+    EmbeddedChannel ch = new EmbeddedChannel(new HttpDownloadHandler(null, ImmutableList.of()));
     downloadShouldWork(true, ch);
     downloadShouldWork(false, ch);
   }
@@ -93,7 +94,7 @@
   /** Test that the handler correctly supports http error codes i.e. 404 (NOT FOUND). */
   @Test
   public void httpErrorsAreSupported() throws IOException {
-    EmbeddedChannel ch = new EmbeddedChannel(new HttpDownloadHandler(null));
+    EmbeddedChannel ch = new EmbeddedChannel(new HttpDownloadHandler(null, ImmutableList.of()));
     ByteArrayOutputStream out = Mockito.spy(new ByteArrayOutputStream());
     DownloadCommand cmd = new DownloadCommand(CACHE_URI, true, "abcdef", out);
     ChannelPromise writePromise = ch.newPromise();
@@ -123,7 +124,7 @@
    */
   @Test
   public void httpErrorsWithContentAreSupported() throws IOException {
-    EmbeddedChannel ch = new EmbeddedChannel(new HttpDownloadHandler(null));
+    EmbeddedChannel ch = new EmbeddedChannel(new HttpDownloadHandler(null, ImmutableList.of()));
     ByteArrayOutputStream out = Mockito.spy(new ByteArrayOutputStream());
     DownloadCommand cmd = new DownloadCommand(CACHE_URI, true, "abcdef", out);
     ChannelPromise writePromise = ch.newPromise();
diff --git a/src/test/java/com/google/devtools/build/lib/remote/blobstore/http/HttpUploadHandlerTest.java b/src/test/java/com/google/devtools/build/lib/remote/blobstore/http/HttpUploadHandlerTest.java
index f3af676..9124faf 100644
--- a/src/test/java/com/google/devtools/build/lib/remote/blobstore/http/HttpUploadHandlerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/remote/blobstore/http/HttpUploadHandlerTest.java
@@ -16,6 +16,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.net.HttpHeaders;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
@@ -49,7 +50,7 @@
    */
   @Test
   public void uploadsShouldWork() throws Exception {
-    EmbeddedChannel ch = new EmbeddedChannel(new HttpUploadHandler(null));
+    EmbeddedChannel ch = new EmbeddedChannel(new HttpUploadHandler(null, ImmutableList.of()));
     HttpResponseStatus[] statuses = new HttpResponseStatus[] {HttpResponseStatus.OK,
         HttpResponseStatus.CREATED, HttpResponseStatus.ACCEPTED, HttpResponseStatus.NO_CONTENT};
 
@@ -86,7 +87,7 @@
   /** Test that the handler correctly supports http error codes i.e. 404 (NOT FOUND). */
   @Test
   public void httpErrorsAreSupported() {
-    EmbeddedChannel ch = new EmbeddedChannel(new HttpUploadHandler(null));
+    EmbeddedChannel ch = new EmbeddedChannel(new HttpUploadHandler(null, ImmutableList.of()));
     ByteArrayInputStream data = new ByteArrayInputStream(new byte[] {1, 2, 3, 4, 5});
     ChannelPromise writePromise = ch.newPromise();
     ch.writeOneOutbound(new UploadCommand(CACHE_URI, true, "abcdef", data, 5), writePromise);
@@ -115,7 +116,7 @@
    */
   @Test
   public void httpErrorsWithContentAreSupported() {
-    EmbeddedChannel ch = new EmbeddedChannel(new HttpUploadHandler(null));
+    EmbeddedChannel ch = new EmbeddedChannel(new HttpUploadHandler(null, ImmutableList.of()));
     ByteArrayInputStream data = new ByteArrayInputStream(new byte[] {1, 2, 3, 4, 5});
     ChannelPromise writePromise = ch.newPromise();
     ch.writeOneOutbound(new UploadCommand(CACHE_URI, true, "abcdef", data, 5), writePromise);
