1 /* 2 * Copyright 2008 Sean Sullivan 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.httpclient4; 18 19 import java.io.IOException; 20 import java.io.InputStream; 21 import java.net.URL; 22 import java.util.ArrayList; 23 import java.util.List; 24 import java.util.Map; 25 import net.oauth.OAuth; 26 import net.oauth.client.ExcerptInputStream; 27 import net.oauth.http.HttpMessage; 28 import net.oauth.http.HttpResponseMessage; 29 import org.apache.http.Header; 30 import org.apache.http.HttpEntityEnclosingRequest; 31 import org.apache.http.HttpResponse; 32 import org.apache.http.client.methods.HttpRequestBase; 33 34 /** 35 * An HttpResponse, encapsulated as an OAuthMessage. 36 * 37 * This class relies on <a href="http://hc.apache.org">Apache HttpClient</a> 38 * version 4. 39 * 40 * @author Sean Sullivan 41 * @hide 42 */ 43 public class HttpMethodResponse extends HttpResponseMessage 44 { 45 46 /** 47 * Construct an OAuthMessage from the HTTP response, including parameters 48 * from OAuth WWW-Authenticate headers and the body. The header parameters 49 * come first, followed by the ones from the response body. 50 */ 51 public HttpMethodResponse(HttpRequestBase request, HttpResponse response, byte[] requestBody, 52 String requestEncoding) throws IOException 53 { 54 super(request.getMethod(), new URL(request.getURI().toString())); 55 this.httpRequest = request; 56 this.httpResponse = response; 57 this.requestBody = requestBody; 58 this.requestEncoding = requestEncoding; 59 this.headers.addAll(getHeaders()); 60 } 61 62 private final HttpRequestBase httpRequest; 63 private final HttpResponse httpResponse; 64 private final byte[] requestBody; 65 private final String requestEncoding; 66 67 @Override 68 public int getStatusCode() 69 { 70 return httpResponse.getStatusLine().getStatusCode(); 71 } 72 73 @Override 74 public InputStream openBody() throws IOException 75 { 76 return httpResponse.getEntity().getContent(); 77 } 78 79 private List<Map.Entry<String, String>> getHeaders() 80 { 81 List<Map.Entry<String, String>> headers = new ArrayList<Map.Entry<String, String>>(); 82 Header[] allHeaders = httpResponse.getAllHeaders(); 83 if (allHeaders != null) { 84 for (Header header : allHeaders) { 85 headers.add(new OAuth.Parameter(header.getName(), header.getValue())); 86 } 87 } 88 return headers; 89 } 90 91 /** Return a complete description of the HTTP exchange. */ 92 @Override 93 public void dump(Map<String, Object> into) throws IOException 94 { 95 super.dump(into); 96 { 97 StringBuilder request = new StringBuilder(httpRequest.getMethod()); 98 request.append(" ").append(httpRequest.getURI().getPath()); 99 String query = httpRequest.getURI().getQuery(); 100 if (query != null && query.length() > 0) { 101 request.append("?").append(query); 102 } 103 request.append(EOL); 104 for (Header header : httpRequest.getAllHeaders()) { 105 request.append(header.getName()).append(": ").append(header.getValue()).append(EOL); 106 } 107 if (httpRequest instanceof HttpEntityEnclosingRequest) { 108 HttpEntityEnclosingRequest r = (HttpEntityEnclosingRequest) httpRequest; 109 long contentLength = r.getEntity().getContentLength(); 110 if (contentLength >= 0) { 111 request.append("Content-Length: ").append(contentLength).append(EOL); 112 } 113 } 114 request.append(EOL); 115 if (requestBody != null) { 116 request.append(new String(requestBody, requestEncoding)); 117 } 118 into.put(REQUEST, request.toString()); 119 } 120 { 121 StringBuilder response = new StringBuilder(); 122 String value = httpResponse.getStatusLine().toString(); 123 response.append(value).append(EOL); 124 for (Header header : httpResponse.getAllHeaders()) { 125 String name = header.getName(); 126 value = header.getValue(); 127 response.append(name).append(": ").append(value).append(EOL); 128 } 129 response.append(EOL); 130 if (body != null) { 131 response.append(new String(((ExcerptInputStream) body).getExcerpt(), 132 getContentCharset())); 133 } 134 into.put(HttpMessage.RESPONSE, response.toString()); 135 } 136 } 137 } 138