Content negotiation (via `Accept` header aka. `request.accept`) in fact is a rather complex thing. Fortunately we can rely on `WebOb` via `request.accept.best_match(...)` (see comment above). The good news: Content negotiation already *is* implemented by Cornice. To recap: This is all about the client asking the server for possible *response content* types.
See also: https://en.wikipedia.org/wiki/Content_negotiation

I was aiming for having a validation function for checking allowed *request* content types via `Content-Type` header aka. `request.content_type`. This is way easier than content negotiation, because there is only *one* representation for the current request body, there's no way around this :-). Without having the HTTP specs ready, this usually starts with a deterministic internet media type (no wildcards possible), followed by optional parameters (subtypes of "text" may carry an encoding along).
See also: https://en.wikipedia.org/wiki/Internet_media_type

So i think the `.startswith(...)` check is perfectly fine for compensating against optional parameters. D'accord?

P.S.: After my first attempt i thought you wanted to direct me to align both implementations inside Cornice, though doing completely different things, which i tried to do in this very changeset. At least, after nagging a bit at first i  finally was totally convinced. :-)

P.P.S.: I tried to update the documentation to get more precise in this direction. It is not uncommon to mix both things up. As you will see, i tried to distinguish both things by phrases like "ingress request content type" and "egress response content type negotiation". Are you fine with that?

(whew) long comment; santé!