/* * oxAuth is available under the MIT License (2008). See http://opensource.org/licenses/MIT for full text. * * Copyright (c) 2014, Gluu */ package org.xdi.oxauth.client; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.jboss.resteasy.client.ClientExecutor; import org.jboss.resteasy.client.ClientRequest; import org.jboss.resteasy.client.ClientResponse; import org.xdi.oxauth.model.common.AuthenticationMethod; import org.xdi.oxauth.model.common.AuthorizationMethod; import org.xdi.oxauth.model.common.HasParamName; import org.xdi.oxauth.model.util.Util; import javax.ws.rs.HttpMethod; import javax.ws.rs.core.Cookie; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * Allows to retrieve HTTP requests to the authorization server and responses from it for display purposes. * * @author Javier Rojas Blum * @version December 26, 2016 */ public abstract class BaseClient<T extends BaseRequest, V extends BaseResponse> { private static final Logger LOG = Logger.getLogger(BaseClient.class); private String url; protected T request; protected V response; protected ClientRequest clientRequest = null; protected ClientResponse<String> clientResponse = null; private final List<Cookie> cookies = new ArrayList<Cookie>(); protected ClientExecutor executor = null; public BaseClient() { } public BaseClient(String url) { this.url = url; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public T getRequest() { return request; } public void setRequest(T request) { this.request = request; } public V getResponse() { return response; } public void setResponse(V response) { this.response = response; } public ClientExecutor getExecutor() { return executor; } public void setExecutor(ClientExecutor executor) { this.executor = executor; } protected void addReqParam(String p_key, HasParamName p_value) { if (p_value != null) { addReqParam(p_key, p_value.getParamName()); } } protected void addReqParam(String p_key, String p_value) { if (Util.allNotBlank(p_key, p_value)) { if (request.getAuthorizationMethod() == AuthorizationMethod.FORM_ENCODED_BODY_PARAMETER) { clientRequest.formParameter(p_key, p_value); } else { clientRequest.queryParameter(p_key, p_value); } } } public static void putAllFormParameters(ClientRequest p_clientRequest, BaseRequest p_request) { if (p_clientRequest != null && p_request != null) { final Map<String, String> parameters = p_request.getParameters(); if (parameters != null && !parameters.isEmpty()) { for (Map.Entry<String, String> e : parameters.entrySet()) { p_clientRequest.formParameter(e.getKey(), e.getValue()); } } } } public String getRequestAsString() { StringBuilder sb = new StringBuilder(); try { URL theUrl = new URL(url); if (getHttpMethod().equals(HttpMethod.POST)) { sb.append(HttpMethod.POST).append(" ").append(theUrl.getPath()).append(" HTTP/1.1"); if (StringUtils.isNotBlank(request.getContentType())) { sb.append("\n"); sb.append("Content-Type: ").append(request.getContentType()); } if (StringUtils.isNotBlank(request.getMediaType())) { sb.append("\n"); sb.append("Accept: ").append(request.getMediaType()); } sb.append("\n"); sb.append("Host: ").append(theUrl.getHost()); if (request instanceof AuthorizationRequest) { AuthorizationRequest authorizationRequest = (AuthorizationRequest) request; if (authorizationRequest.isUseNoRedirectHeader()) { sb.append("\n"); sb.append("X-Gluu-NoRedirect: true"); } } if (request.getAuthorizationMethod() == null) { if (request.getAuthenticationMethod() == null || request.getAuthenticationMethod() == AuthenticationMethod.CLIENT_SECRET_BASIC) { if (request.hasCredentials()) { String encodedCredentials = request.getEncodedCredentials(); sb.append("\n"); sb.append("Authorization: Basic ").append(encodedCredentials); } } } else if (request.getAuthorizationMethod() == AuthorizationMethod.AUTHORIZATION_REQUEST_HEADER_FIELD) { if (request instanceof UserInfoRequest) { String accessToken = ((UserInfoRequest) request).getAccessToken(); sb.append("\n"); sb.append("Authorization: Bearer ").append(accessToken); } } sb.append("\n"); sb.append("\n"); sb.append(request.getQueryString()); } else if (getHttpMethod().equals(HttpMethod.GET)) { sb.append("GET ").append(theUrl.getPath()); if (StringUtils.isNotBlank(request.getQueryString())) { sb.append("?").append(request.getQueryString()); } sb.append(" HTTP/1.1"); sb.append("\n"); sb.append("Host: ").append(theUrl.getHost()); if (request instanceof AuthorizationRequest) { AuthorizationRequest authorizationRequest = (AuthorizationRequest) request; if (authorizationRequest.isUseNoRedirectHeader()) { sb.append("\n"); sb.append("X-Gluu-NoRedirect: true"); } } if (request.getAuthorizationMethod() == null) { if (request.hasCredentials()) { String encodedCredentials = request.getEncodedCredentials(); sb.append("\n"); sb.append("Authorization: Basic ").append(encodedCredentials); } else if (request instanceof RegisterRequest) { RegisterRequest r = (RegisterRequest) request; String registrationAccessToken = r.getRegistrationAccessToken(); sb.append("\n"); sb.append("Authorization: Bearer ").append(registrationAccessToken); } } else if (request.getAuthorizationMethod() == AuthorizationMethod.AUTHORIZATION_REQUEST_HEADER_FIELD) { if (request instanceof UserInfoRequest) { String accessToken = ((UserInfoRequest) request).getAccessToken(); sb.append("\n"); sb.append("Authorization: Bearer ").append(accessToken); } } } } catch (MalformedURLException e) { LOG.error(e.getMessage(), e); } return sb.toString(); } public String getResponseAsString() { StringBuilder sb = new StringBuilder(); if (response != null) { sb.append("HTTP/1.1 ").append(response.getStatus()); if (response.getHeaders() != null) { for (String key : response.getHeaders().keySet()) { sb.append("\n") .append(key) .append(": ") .append(response.getHeaders().get(key).get(0)); } } if (response.getEntity() != null) { sb.append("\n"); sb.append("\n"); sb.append(response.getEntity()); } } return sb.toString(); } protected void initClientRequest() { if (this.executor == null) { this.clientRequest = new ClientRequest(getUrl()); } else { this.clientRequest = new ClientRequest(getUrl(), this.executor); } for (Cookie cookie : cookies) { clientRequest.cookie(cookie); } } public void closeConnection() { try { if (clientResponse != null) { clientResponse.releaseConnection(); } if (clientRequest != null && clientRequest.getExecutor() != null) { clientRequest.getExecutor().close(); } } catch (Exception e) { LOG.error(e.getMessage(), e); } } public abstract String getHttpMethod(); public List<Cookie> getCookies() { return cookies; } }