001package com.nimbusds.oauth2.sdk.client; 002 003 004import java.net.URL; 005 006import org.apache.commons.lang3.StringUtils; 007 008import net.jcip.annotations.Immutable; 009 010import com.nimbusds.oauth2.sdk.ParseException; 011import com.nimbusds.oauth2.sdk.ProtectedResourceRequest; 012import com.nimbusds.oauth2.sdk.SerializeException; 013import com.nimbusds.oauth2.sdk.http.HTTPRequest; 014import com.nimbusds.oauth2.sdk.token.BearerAccessToken; 015 016 017/** 018 * Client read request. This class is immutable. 019 * 020 * <p>Example HTTP request: 021 * 022 * <pre> 023 * GET /register/s6BhdRkqt3 HTTP/1.1 024 * Accept: application/json 025 * Host: server.example.com 026 * Authorization: Bearer reg-23410913-abewfq.123483 027 * </pre> 028 * 029 * <p>Related specifications: 030 * 031 * <ul> 032 * <li>OAuth 2.0 Dynamic Client Registration Protocol 033 * (draft-ietf-oauth-dyn-reg-14), section 4.2. 034 * </ul> 035 * 036 * @author Vladimir Dzhuvinov 037 */ 038@Immutable 039public class ClientReadRequest extends ProtectedResourceRequest { 040 041 042 /** 043 * Creates a new client read request. 044 * 045 * @param uri The URI of the client configuration endpoint. May 046 * be {@code null} if the {@link #toHTTPRequest()} 047 * method will not be used. 048 * @param accessToken An OAuth 2.0 Bearer access token for the request. 049 * Must not be {@code null}. 050 */ 051 public ClientReadRequest(final URL uri, final BearerAccessToken accessToken) { 052 053 super(uri, accessToken); 054 055 if (accessToken == null) 056 throw new IllegalArgumentException("The access token must not be null"); 057 } 058 059 060 @Override 061 public HTTPRequest toHTTPRequest() 062 throws SerializeException { 063 064 if (getURI() == null) 065 throw new SerializeException("The endpoint URI is not specified"); 066 067 HTTPRequest httpRequest = new HTTPRequest(HTTPRequest.Method.GET, getURI()); 068 httpRequest.setAuthorization(getAccessToken().toAuthorizationHeader()); 069 return httpRequest; 070 } 071 072 073 /** 074 * Parses a client read request from the specified HTTP GET request. 075 * 076 * @param httpRequest The HTTP request. Must not be {@code null}. 077 * 078 * @return The client read request. 079 * 080 * @throws ParseException If the HTTP request couldn't be parsed to a 081 * client read request. 082 */ 083 public static ClientReadRequest parse(final HTTPRequest httpRequest) 084 throws ParseException { 085 086 httpRequest.ensureMethod(HTTPRequest.Method.GET); 087 088 String authzHeaderValue = httpRequest.getAuthorization(); 089 090 if (StringUtils.isBlank(authzHeaderValue)) 091 throw new ParseException("Missing HTTP Authorization header"); 092 093 BearerAccessToken accessToken = BearerAccessToken.parse(authzHeaderValue); 094 095 return new ClientReadRequest(httpRequest.getURL(), accessToken); 096 } 097}