Home | History | Annotate | Download | only in client
      1 /*
      2  * Copyright 2008 Netflix, Inc.
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *     http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package net.oauth.client;
     18 
     19 import java.io.IOException;
     20 import java.io.InputStream;
     21 import java.net.HttpURLConnection;
     22 import java.net.URLConnection;
     23 import java.util.ArrayList;
     24 import java.util.List;
     25 import java.util.Map;
     26 import net.oauth.OAuth;
     27 import net.oauth.http.HttpMessage;
     28 import net.oauth.http.HttpResponseMessage;
     29 
     30 /**
     31  * The response part of a URLConnection, encapsulated as an OAuthMessage.
     32  *
     33  * @author John Kristian
     34  * @hide
     35  */
     36 public class URLConnectionResponse extends HttpResponseMessage {
     37 
     38     /**
     39      * Construct an OAuthMessage from the HTTP response, including parameters
     40      * from OAuth WWW-Authenticate headers and the body. The header parameters
     41      * come first, followed by the ones from the response body.
     42      */
     43     public URLConnectionResponse(HttpMessage request, String requestHeaders,
     44             byte[] requestExcerpt, URLConnection connection) throws IOException {
     45         super(request.method, request.url);
     46         this.requestHeaders = requestHeaders;
     47         this.requestExcerpt = requestExcerpt;
     48         this.requestEncoding = request.getContentCharset();
     49         this.connection = connection;
     50         this.headers.addAll(getHeaders());
     51     }
     52 
     53     private final String requestHeaders;
     54     private final byte[] requestExcerpt;
     55     private final String requestEncoding;
     56     private final URLConnection connection;
     57 
     58     @Override
     59     public int getStatusCode() throws IOException {
     60         if (connection instanceof HttpURLConnection) {
     61             return ((HttpURLConnection) connection).getResponseCode();
     62         }
     63         return STATUS_OK;
     64     }
     65 
     66     @Override
     67     public InputStream openBody() {
     68         try {
     69             return connection.getInputStream();
     70         } catch (IOException ohWell) {
     71         }
     72         return null;
     73     }
     74 
     75     private List<Map.Entry<String, String>> getHeaders() {
     76         List<Map.Entry<String, String>> headers = new ArrayList<Map.Entry<String, String>>();
     77         boolean foundContentType = false;
     78         String value;
     79         for (int i = 0; (value = connection.getHeaderField(i)) != null; ++i) {
     80             String name = connection.getHeaderFieldKey(i);
     81             if (name != null) {
     82                 headers.add(new OAuth.Parameter(name, value));
     83                 if (CONTENT_TYPE.equalsIgnoreCase(name)) {
     84                     foundContentType = true;
     85                 }
     86             }
     87         }
     88         if (!foundContentType) {
     89             headers.add(new OAuth.Parameter(CONTENT_TYPE, connection
     90                     .getContentType()));
     91         }
     92         return headers;
     93     }
     94     /** Return a complete description of the HTTP exchange. */
     95     @Override
     96     public void dump(Map<String, Object> into) throws IOException {
     97         super.dump(into);
     98         {
     99             StringBuilder request = new StringBuilder(requestHeaders);
    100             request.append(EOL);
    101             if (requestExcerpt != null) {
    102                 request.append(new String(requestExcerpt, requestEncoding));
    103             }
    104             into.put(REQUEST, request.toString());
    105         }
    106         {
    107             HttpURLConnection http = (connection instanceof HttpURLConnection) ? (HttpURLConnection) connection
    108                     : null;
    109             StringBuilder response = new StringBuilder();
    110             String value;
    111             for (int i = 0; (value = connection.getHeaderField(i)) != null; ++i) {
    112                 String name = connection.getHeaderFieldKey(i);
    113                 if (i == 0 && name != null && http != null) {
    114                     String firstLine = "HTTP " + getStatusCode();
    115                     String message = http.getResponseMessage();
    116                     if (message != null) {
    117                         firstLine += (" " + message);
    118                     }
    119                     response.append(firstLine).append(EOL);
    120                 }
    121                 if (name != null) {
    122                     response.append(name).append(": ");
    123                     name = name.toLowerCase();
    124                 }
    125                 response.append(value).append(EOL);
    126             }
    127             response.append(EOL);
    128             if (body != null) {
    129                 response.append(new String(((ExcerptInputStream) body)
    130                         .getExcerpt(), getContentCharset()));
    131             }
    132             into.put(HttpMessage.RESPONSE, response.toString());
    133         }
    134     }
    135 
    136 }
    137