VirtualService works with tcp match but not http match

I have the following virtualservice:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: a-service
  namespace: default
spec:
  hosts:
  - 'a-service.default.svc.cluster.local'
  gateways:
  - gateway
  tcp:
#  http:
  - match:
    - port: 8080
    route:
    - destination:
        host: 'a-service.default.svc.cluster.local'
        port:
          number: 8080

Using tcp I get a 200. Using http I get “Empty response from server”. I’ve tried two different dead-simple golang http servers: the first from docker, the second from hashicorp: 1, 2

My ingressgateway is a base install via Helm. No changes.

My gateway is:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: gateway
  namespace: default
spec:
  selector:
    app: istio-ingressgateway
  servers:
  - port:
      number: 8080
      name: http-echo
      protocol: TCP
    hosts:
    - 'a-service.default.svc.cluster.local'

Is this because the base ingressgateway install specifies the http2 port as TCP? Or because my gateway specifies the http-echo port as TCP? I didn’t think that mattered? I mean: why would the base ingressgateway configuration specify the http2 port as TCP anyway?

Anyway: any insight as to what the problem could be here would be greatly appreciated!

Indeed changing gateway to http is at least now producing 404 not found. But obviously the literal app path is not the issue as there is no other path but root.