func chooseEncoder(req *http.Request) (encoder, string) { accepts := goautoneg.ParseAccept(req.Header.Get(acceptHeader)) for _, accept := range accepts { switch { case accept.Type == "application" && accept.SubType == "vnd.google.protobuf" && accept.Params["proto"] == "io.prometheus.client.MetricFamily": switch accept.Params["encoding"] { case "delimited": return text.WriteProtoDelimited, DelimitedTelemetryContentType case "text": return text.WriteProtoText, ProtoTextTelemetryContentType case "compact-text": return text.WriteProtoCompactText, ProtoCompactTextTelemetryContentType default: continue } case accept.Type == "text" && accept.SubType == "plain" && (accept.Params["version"] == "0.0.4" || accept.Params["version"] == ""): return text.MetricFamilyToText, TextTelemetryContentType default: continue } } return text.MetricFamilyToText, TextTelemetryContentType }
// Negotiate returns the Content-Type based on the given Accept header. // If no appropriate accepted type is found, FmtText is returned. func Negotiate(h http.Header) Format { for _, ac := range goautoneg.ParseAccept(h.Get(hdrAccept)) { // Check for protocol buffer if ac.Type+"/"+ac.SubType == ProtoType && ac.Params["proto"] == ProtoProtocol { switch ac.Params["encoding"] { case "delimited": return FmtProtoDelim case "text": return FmtProtoText case "compact-text": return FmtProtoCompact } } // Check for text format. ver := ac.Params["version"] if ac.Type == "text" && ac.SubType == "plain" && (ver == TextVersion || ver == "") { return FmtText } } return FmtText }