1b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien/*
2b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien * Copyright 2008 Netflix, Inc.
3b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien *
4b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien * Licensed under the Apache License, Version 2.0 (the "License");
5b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien * you may not use this file except in compliance with the License.
6b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien * You may obtain a copy of the License at
7b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien *
8b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien *     http://www.apache.org/licenses/LICENSE-2.0
9b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien *
10b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien * Unless required by applicable law or agreed to in writing, software
11b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien * distributed under the License is distributed on an "AS IS" BASIS,
12b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien * See the License for the specific language governing permissions and
14b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien * limitations under the License.
15b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien */
16b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien
17b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembienpackage net.oauth.client;
18b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien
19b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembienimport java.io.IOException;
20b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembienimport java.io.InputStream;
21b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembienimport java.util.Map;
22b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembienimport net.oauth.OAuth;
23b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembienimport net.oauth.OAuthMessage;
24b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembienimport net.oauth.OAuthProblemException;
25b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembienimport net.oauth.http.HttpMessage;
26b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembienimport net.oauth.http.HttpResponseMessage;
27b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien
28b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien/**
29b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien * An HTTP response, encapsulated as an OAuthMessage.
30b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien *
31b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien * @author John Kristian
32b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien * @hide
33b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien */
34b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembienfinal class OAuthResponseMessage extends OAuthMessage
35b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien{
36b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien    OAuthResponseMessage(HttpResponseMessage http) throws IOException
37b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien    {
38b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien        super(http.method, http.url.toExternalForm(), null);
39b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien        this.http = http;
40b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien        getHeaders().addAll(http.headers);
41b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien        for (Map.Entry<String, String> header : http.headers) {
42b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien            if ("WWW-Authenticate".equalsIgnoreCase(header.getKey())) {
43b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien                for (OAuth.Parameter parameter : decodeAuthorization(header.getValue())) {
44b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien                    if (!"realm".equalsIgnoreCase(parameter.getKey())) {
45b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien                        addParameter(parameter);
46b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien                    }
47b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien                }
48b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien            }
49b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien        }
50b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien    }
51b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien
52b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien    private final HttpMessage http;
53b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien
54b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien    @Override
55b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien    public InputStream getBodyAsStream() throws IOException
56b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien    {
57b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien        return http.getBody();
58b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien    }
59b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien
60b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien    @Override
61b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien    public String getBodyEncoding()
62b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien    {
63b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien        return http.getContentCharset();
64b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien    }
65b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien
66b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien    @Override
67b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien    protected void completeParameters() throws IOException
68b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien    {
69b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien        super.completeParameters();
70b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien        String body = readBodyAsString();
71b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien        if (body != null) {
72b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien            addParameters(OAuth.decodeForm(body.trim()));
73b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien        }
74b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien    }
75b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien
76b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien    @Override
77b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien    protected void dump(Map<String, Object> into) throws IOException
78b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien    {
79b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien        super.dump(into);
80b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien        http.dump(into);
81b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien    }
82b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien
83b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien    @Override
84b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien    public void requireParameters(String... names) throws OAuthProblemException, IOException {
85b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien        try {
86b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien            super.requireParameters(names);
87b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien        } catch (OAuthProblemException problem) {
88b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien            problem.getParameters().putAll(getDump());
89b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien            throw problem;
90b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien        }
91b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien    }
92b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien
93b852fcf48a8909164d7f323dd02a35d2a8056a61Nico Sallembien}
94