diff options
Diffstat (limited to 'core/src/main/java/net/oauth/client/URLConnectionResponse.java')
-rwxr-xr-x | core/src/main/java/net/oauth/client/URLConnectionResponse.java | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/core/src/main/java/net/oauth/client/URLConnectionResponse.java b/core/src/main/java/net/oauth/client/URLConnectionResponse.java new file mode 100755 index 0000000..4061ca8 --- /dev/null +++ b/core/src/main/java/net/oauth/client/URLConnectionResponse.java @@ -0,0 +1,136 @@ +/* + * Copyright 2008 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.oauth.client; + +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import net.oauth.OAuth; +import net.oauth.http.HttpMessage; +import net.oauth.http.HttpResponseMessage; + +/** + * The response part of a URLConnection, encapsulated as an OAuthMessage. + * + * @author John Kristian + * @hide + */ +public class URLConnectionResponse extends HttpResponseMessage { + + /** + * Construct an OAuthMessage from the HTTP response, including parameters + * from OAuth WWW-Authenticate headers and the body. The header parameters + * come first, followed by the ones from the response body. + */ + public URLConnectionResponse(HttpMessage request, String requestHeaders, + byte[] requestExcerpt, URLConnection connection) throws IOException { + super(request.method, request.url); + this.requestHeaders = requestHeaders; + this.requestExcerpt = requestExcerpt; + this.requestEncoding = request.getContentCharset(); + this.connection = connection; + this.headers.addAll(getHeaders()); + } + + private final String requestHeaders; + private final byte[] requestExcerpt; + private final String requestEncoding; + private final URLConnection connection; + + @Override + public int getStatusCode() throws IOException { + if (connection instanceof HttpURLConnection) { + return ((HttpURLConnection) connection).getResponseCode(); + } + return STATUS_OK; + } + + @Override + public InputStream openBody() { + try { + return connection.getInputStream(); + } catch (IOException ohWell) { + } + return null; + } + + private List<Map.Entry<String, String>> getHeaders() { + List<Map.Entry<String, String>> headers = new ArrayList<Map.Entry<String, String>>(); + boolean foundContentType = false; + String value; + for (int i = 0; (value = connection.getHeaderField(i)) != null; ++i) { + String name = connection.getHeaderFieldKey(i); + if (name != null) { + headers.add(new OAuth.Parameter(name, value)); + if (CONTENT_TYPE.equalsIgnoreCase(name)) { + foundContentType = true; + } + } + } + if (!foundContentType) { + headers.add(new OAuth.Parameter(CONTENT_TYPE, connection + .getContentType())); + } + return headers; + } + /** Return a complete description of the HTTP exchange. */ + @Override + public void dump(Map<String, Object> into) throws IOException { + super.dump(into); + { + StringBuilder request = new StringBuilder(requestHeaders); + request.append(EOL); + if (requestExcerpt != null) { + request.append(new String(requestExcerpt, requestEncoding)); + } + into.put(REQUEST, request.toString()); + } + { + HttpURLConnection http = (connection instanceof HttpURLConnection) ? (HttpURLConnection) connection + : null; + StringBuilder response = new StringBuilder(); + String value; + for (int i = 0; (value = connection.getHeaderField(i)) != null; ++i) { + String name = connection.getHeaderFieldKey(i); + if (i == 0 && name != null && http != null) { + String firstLine = "HTTP " + getStatusCode(); + String message = http.getResponseMessage(); + if (message != null) { + firstLine += (" " + message); + } + response.append(firstLine).append(EOL); + } + if (name != null) { + response.append(name).append(": "); + name = name.toLowerCase(); + } + response.append(value).append(EOL); + } + response.append(EOL); + if (body != null) { + response.append(new String(((ExcerptInputStream) body) + .getExcerpt(), getContentCharset())); + } + into.put(HttpMessage.RESPONSE, response.toString()); + } + } + +} |