title: Istio adds and removed headers, but doesn't overwrite
body: <p>I am trying to add, overwrite and remove headers with <code>VirtualServices</code>, with Istio. Adding a header to the request and removing a header from the response works just fine, but it is not overwriting the header from the request.</p>
  
  <p>So, according to Istio docs, headers operations are as follows:</p>
  
  <p><a href="https://i.stack.imgur.com/Ckk8K.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/Ckk8K.png" alt="enter image description here"></a></p>
  
  <p>And this is my <code>VirtualService</code>:</p>
  
  <pre><code>apiVersion: networking.istio.io/v1alpha3
  kind: VirtualService
  metadata:
    name: server-vs
  spec:
    hosts:
    - server.istio.svc.cluster.local
    http:
    - headers:
        request:
          set:
            test: "true"
          add:
            added: "header"
      route:
      - destination:
          host: server.istio.svc.cluster.local
          subset: apache
        weight: 90
      - destination:
          host: server.istio.svc.cluster.local
          subset: nginx
        headers:
          response:
            remove:
            - foo
        weight: 10
  </code></pre>
  
  <p>Focusing on <code>set</code> a header, this is my understanding. Istio is going to identify a header with key <code>test</code>, and it is going to overwrite the value by <code>true</code>. So, if I curl my service with <code>-H "test: hello"</code> parameter, I should see <code>test: true</code> in my request.</p>
  
  <p>Now, I have tcpdump installed in my backend pod, and I can see <code>added: header</code>. I can also see that <code>foo: bar</code> has been removed (my nginx server is returning <code>foo: bar</code> along with the response), but I can't see <code>test: true</code> header. Is my understanding correct about header operations with Istio?</p>
  
  <p><strong>From the tests:</strong></p>
  
  <p><strong>REQUEST</strong></p>
  
  <pre><code>/ # curl -H "test: hello" server
  &lt;h1&gt;THIS IS AN ISTIO DEMO&lt;/h1&gt;/ # 
  </code></pre>
  
  <p><strong>RESPONSE</strong></p>
  
  <pre><code>15:47:27.387891 IP 192.168.49.58.39652 &gt; 192.168.113.134.80: Flags [S], seq 2810811797, win 28000, options [mss 1400,sackOK,TS val 1900372734 ecr 0,nop,wscale 7], length 0
  E..&lt;d.@.&gt;.....1:..q....P..........m`
  3.....x...
  qEb.........
  15:47:27.388130 IP 192.168.49.58.39652 &gt; 192.168.113.134.80: Flags [.], ack 2093848160, win 219, options [nop,nop,TS val 1900372735 ecr 3950379544], length 0
  E..4d.@.&gt;.....1:..q....P....|..`.....z.....
  qEb..v..
  15:47:27.388202 IP 192.168.49.58.39652 &gt; 192.168.113.134.80: Flags [P.], seq 2810811798:2810812507, ack 2093848160, win 219, options [nop,nop,TS val 1900372735 ecr 3950379544], length 709: HTTP: GET / HTTP/1.1
  E...d.@.&gt;.....1:..q....P....|..`....S&amp;.....
  qEb..v..GET / HTTP/1.1
  host: server
  user-agent: curl/7.59.0
  accept: */*
  test: hello                  &lt;-HERE IS THE HEADER THAT SUPPOSED TO BE OVERWRITTEN
  x-forwarded-proto: http
  x-request-id: 05ff2bb6-8810-9411-8a3b-7456066e1d16
  x-envoy-decorator-operation: server-vs:80/*
  x-istio-attributes: CjwKGGRlc3RpbmF0aW9uLnNlcnZpY2UuaG9zdBIgEh5zZXJ2ZXIuaXN0aW8uc3ZjLmNsdXN0ZXIubG9jYWwKOgoXZGVzdGluYXRpb24uc2VydmljZS51aWQSHxIdaXN0aW86Ly9pc3Rpby9zZXJ2aWNlcy9zZXJ2ZXIKJAoYZGVzdGluYXRpb24uc2VydmljZS5uYW1lEggSBnNlcnZlcgooCh1kZXN0aW5hdGlvbi5zZXJ2aWNlLm5hbWVzcGFjZRIHEgVpc3Rpbwo6Cgpzb3VyY2UudWlkEiwSKmt1YmVybmV0ZXM6Ly9jdXJsZXItNzU1Y2M3Y2ZmZi14dmxiMi5pc3Rpbw==
  x-b3-traceid: 741c90fab1ca5e23802399916451563e
  x-b3-spanid: 802399916451563e
  x-b3-sampled: 1
  added: header                &lt;- HERE IS THE ADDED HEADER
  content-length: 0
  
  
  15:47:27.390857 IP 192.168.49.58.39652 &gt; 192.168.113.134.80: Flags [.], ack 2093848436, win 228, options [nop,nop,TS val 1900372737 ecr 3950379547], length 0
  E..4d.@.&gt;.....1:..q....P...[|..t...........
  qEc..v..
  </code></pre>
  
  <p>But I was expecting to see <code>test: true</code></p>