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  default String[] getParameterValues(String name) {
047    try {
048      ArrayList<String> result = new ArrayList<>();
049      String queryString = getQueryString();
050      if (queryString != null) {
051        String[] pairs = queryString.split("&");
052        for (String pair : pairs) {
053          int idx = pair.indexOf("=");
054          if (idx != -1 && URLDecoder.decode(pair.substring(0, idx), "UTF-8").equals(name)) {
055            result.add(URLDecoder.decode(pair.substring(idx + 1), "UTF-8"));
056          }
057        }
058      }
059      if (result.isEmpty()) {
060        // Servlet API: getParameterValues() returns null if the parameter does not exist.
061        return null;
062      } else {
063        return result.toArray(new String[0]);
064      }
065    } catch (UnsupportedEncodingException e) {
066      // UTF-8 encoding not supported.
067      throw new RuntimeException(e);
068    }
069  }
070}