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}