title: Istio HTTPMatchRequest seems to match request using OR logic instead of the documented AND logic
body: <p>As per <a href="https://istio.io/docs/reference/config/networking/v1alpha3/virtual-service/#HTTPMatchRequest" rel="nofollow noreferrer">https://istio.io/docs/reference/config/networking/v1alpha3/virtual-service/#HTTPMatchRequest</a> , </p>
  
  <blockquote>
    <p>HttpMatchRequest specifies a set of criterion to be met in order for the rule to be applied to the HTTP request. For example, the following restricts the rule to match only requests where the URL path starts with /ratings/v2/ and the request contains a custom end-user header with value jason.</p>
  </blockquote>
  
  <p>i take that to mean the matching should be of type <strong>AND</strong> .</p>
  
  <p>Below is an istio virtual service definition. As per the above definition, I'd assume that this virtual service only permits requests of the form <strong>POST /status/...</strong></p>
  
  <p>However, It seems that the logic is actually OR i.e. either POST requests or (for instance, GET /status/xxx) requests go through . Can someone explain or correct my config.</p>
  
  <pre><code>apiVersion: networking.istio.io/v1alpha3
  kind: VirtualService
  metadata:
    name: "httpbin-virtual-service"
  spec:
    hosts:
    - "*"
    gateways:
    - my-istio-gateway
    http:
    - match:
      - method:
          exact: POST
      - uri:
          prefix: /status
      route:
      - destination:
          host: "httpbin"
          port:
            number: 80 # application port
  </code></pre>
  
  <p>Output</p>
  
  <pre><code>$ siege -c1 -d1 --content-type "application/json" '127.0.0.1:31380/delay/2 POST {"ids": ["1","2","3"]}' ==&gt; not a request to /status/.. , why does this match
  HTTP/1.1 200     2.00 secs:    1072 bytes ==&gt; POST http://127.0.0.1:31380/delay/2
  HTTP/1.1 200     2.01 secs:    1072 bytes ==&gt; POST http://127.0.0.1:31380/delay/2
  ..
  
  $ siege -c1 -d1 127.0.0.1:31380/status/200  ====================&gt; not a POST request , why does this match
  HTTP/1.1 200     0.00 secs:       0 bytes ==&gt; GET  /status/200
  HTTP/1.1 200     0.00 secs:       0 bytes ==&gt; GET  /status/200
  ..
  </code></pre>