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}