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