docs: public void getRequestToken(HttpServletRequest request, HttpServletResponse response, String callbackUrl, String stateValue, SocialLoginConfig config) {
          TwitterEndpointServices twitter = getTwitterEndpointServices();
          twitter.setConsumerKey(config.getClientId());
          twitter.setConsumerSecret(config.getClientSecret());
  
          Map<String, Object> result = twitter.obtainRequestToken(config, callbackUrl);
          if (result == null || result.isEmpty()) {
              Tr.error(tc, "TWITTER_ERROR_OBTAINING_ENDPOINT_RESULT", new Object[] { TwitterConstants.TWITTER_ENDPOINT_REQUEST_TOKEN });
              ErrorHandlerImpl.getInstance().handleErrorResponse(response);
              return;
          }
  
          if (tc.isDebugEnabled()) {
              Tr.debug(tc, TwitterConstants.TWITTER_ENDPOINT_REQUEST_TOKEN + " result: " + result.toString());
          }
  
          try {
              if (!isSuccessfulResult(result, TwitterConstants.TWITTER_ENDPOINT_REQUEST_TOKEN)) {
                  ErrorHandlerImpl.getInstance().handleErrorResponse(response);
                  return;
              }
  
              // If successful, the result has already been verified to contain a non-empty oauth_token and oauth_token_secret
              String requestToken = (String) result.get(TwitterConstants.RESPONSE_OAUTH_TOKEN);
  
              // Cache request token to verify against later
              setCookies(request, response, requestToken, stateValue);
  
              // Redirect to authorization endpoint with the provided request token
              String authzEndpoint = config.getAuthorizationEndpoint();
              try {
                  SocialUtil.validateEndpointWithQuery(authzEndpoint);
              } catch (SocialLoginException e) {
                  Tr.error(tc, "FAILED_TO_REDIRECT_TO_AUTHZ_ENDPOINT", new Object[] { config.getUniqueId(), e.getMessage() });
                  ErrorHandlerImpl.getInstance().handleErrorResponse(response);
                  return;
              }
              String queryChar = (authzEndpoint.contains("?")) ? "&" : "?";
              response.sendRedirect(authzEndpoint + queryChar + TwitterConstants.PARAM_OAUTH_TOKEN + "=" + requestToken);
  
          } catch (IOException e) {
              Tr.error(tc, "TWITTER_REDIRECT_IOEXCEPTION", new Object[] { TwitterConstants.TWITTER_ENDPOINT_REQUEST_TOKEN, e.getLocalizedMessage() });
              ErrorHandlerImpl.getInstance().handleErrorResponse(response, HttpServletResponse.SC_BAD_REQUEST);
              return;
          }
      }