(from AES) filterutil: Fix a bug with header capitalization and append-vs-replace
(from AES) filterutil: Fix a bug with header capitalization and append-vs-replace

Max was hitting this bug in System A.

TL;DR of how he was hitting it:

 1. He was submitting a request with `Authorization: Basic ...`

 2. Envoy hands that off to amb-sidecar as `authorization: Basic ...`

 3. An OAuth2 Filter issued
    `filterapi.HTTPHeaderReplaceValue{"authorization", "Bearer ..."}`

 4. (bug part 1) `filterutil.ApplyRequestModification()` applied
    `http.CanonicalHeaderKey()` on the incoming modification, but not
    the existing request headers.  So it resulted in the header being
    set to

        map[string]string{
            "authorization": "Basic ...",
            "Authorization": "Bearer ...",
        }

 5. That modified request then gets handed off to the resource-server
    part of the OAuth2 Filter, which calls `filterutil.GetHeader(req)`
    to get the header to work with it.

 6. (bug part 2) `filterutil.GetHeader()` doesn't correctly handle the
    possiblitiy of multiple values for a key, because it assumes that
    the key case is already fully normalized.  (Now, that *should* be
    true (bug part 1), but it *should* also be robust to it not being
    true).  So, because map iteration order in Go is randomized, it
    either ends up with

       http.Header{
           "Authorization": "Basic ...",
       }

    or

       http.Header{
           "Authorization": "Bearer ...",
       }

    In one case, everything appears to work, and in the other case you
    get an error.

datawire/ambassador,datawire/ambassador,datawire/ambassador,datawire/ambassador,datawire/ambassador