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