001package io.prometheus.metrics.exporter.common; 002 003import io.prometheus.metrics.model.registry.PrometheusScrapeRequest; 004import java.io.UnsupportedEncodingException; 005import java.net.URLDecoder; 006import java.util.ArrayList; 007import java.util.Enumeration; 008import javax.annotation.Nullable; 009 010public interface PrometheusHttpRequest extends PrometheusScrapeRequest { 011 012 /** See {@code jakarta.servlet.http.HttpServletRequest.getQueryString()} */ 013 String getQueryString(); 014 015 /** See {@code jakarta.servlet.http.HttpServletRequest.getHeaders(String)} */ 016 Enumeration<String> getHeaders(String name); 017 018 /** See {@code jakarta.servlet.http.HttpServletRequest.getMethod()} */ 019 String getMethod(); 020 021 /** See {@code jakarta.servlet.http.HttpServletRequest.getHeader(String)} */ 022 @Nullable 023 default String getHeader(String name) { 024 Enumeration<String> headers = getHeaders(name); 025 if (headers == null || !headers.hasMoreElements()) { 026 return null; 027 } else { 028 return headers.nextElement(); 029 } 030 } 031 032 /** See {@code jakarta.servlet.ServletRequest.getParameter(String)} */ 033 @Nullable 034 default String getParameter(String name) { 035 String[] values = getParameterValues(name); 036 if (values == null || values.length == 0) { 037 return null; 038 } else { 039 return values[0]; 040 } 041 } 042 043 /** See {@code jakarta.servlet.ServletRequest.getParameterValues(String)} */ 044 @Override 045 @Nullable 046 // decode with Charset is only available in Java 10+, but we want to support Java 8 047 @SuppressWarnings("JdkObsolete") 048 default String[] getParameterValues(String name) { 049 try { 050 ArrayList<String> result = new ArrayList<>(); 051 String queryString = getQueryString(); 052 if (queryString != null) { 053 String[] pairs = queryString.split("&"); 054 for (String pair : pairs) { 055 int idx = pair.indexOf("="); 056 if (idx != -1 && URLDecoder.decode(pair.substring(0, idx), "UTF-8").equals(name)) { 057 result.add(URLDecoder.decode(pair.substring(idx + 1), "UTF-8")); 058 } 059 } 060 } 061 if (result.isEmpty()) { 062 // Servlet API: getParameterValues() returns null if the parameter does not exist. 063 return null; 064 } else { 065 return result.toArray(new String[0]); 066 } 067 } catch (UnsupportedEncodingException e) { 068 // UTF-8 encoding not supported. 069 throw new RuntimeException(e); 070 } 071 } 072}