View Javadoc
1   /*
2    * ====================================================================
3    * Licensed to the Apache Software Foundation (ASF) under one
4    * or more contributor license agreements.  See the NOTICE file
5    * distributed with this work for additional information
6    * regarding copyright ownership.  The ASF licenses this file
7    * to you under the Apache License, Version 2.0 (the
8    * "License"); you may not use this file except in compliance
9    * with the License.  You may obtain a copy of the License at
10   *
11   *   http://www.apache.org/licenses/LICENSE-2.0
12   *
13   * Unless required by applicable law or agreed to in writing,
14   * software distributed under the License is distributed on an
15   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16   * KIND, either express or implied.  See the License for the
17   * specific language governing permissions and limitations
18   * under the License.
19   * ====================================================================
20   *
21   * This software consists of voluntary contributions made by many
22   * individuals on behalf of the Apache Software Foundation.  For more
23   * information on the Apache Software Foundation, please see
24   * <http://www.apache.org/>.
25   *
26   */
27  
28  package org.apache.hc.client5.http.impl.classic;
29  
30  import java.io.IOException;
31  import java.util.Iterator;
32  import java.util.Locale;
33  
34  import org.apache.hc.client5.http.classic.ExecRuntime;
35  import org.apache.hc.core5.annotation.Internal;
36  import org.apache.hc.core5.http.ClassicHttpResponse;
37  import org.apache.hc.core5.http.Header;
38  import org.apache.hc.core5.http.HttpEntity;
39  import org.apache.hc.core5.http.ProtocolException;
40  import org.apache.hc.core5.http.ProtocolVersion;
41  import org.apache.hc.core5.util.Args;
42  
43  /**
44   * Provided for backward compatibility with HttpClient 4.x.
45   *
46   * @since 4.3
47   */
48  public final class CloseableHttpResponse implements ClassicHttpResponse {
49  
50      private final ClassicHttpResponse response;
51      private final ExecRuntime execRuntime;
52  
53      /**
54       * @since 5.4
55       */
56      @Internal
57      public static CloseableHttpResponse adapt(final ClassicHttpResponse response) {
58          if (response == null) {
59              return null;
60          }
61          return response instanceof CloseableHttpResponse
62                          ? (CloseableHttpResponse) response
63                          : new CloseableHttpResponse(response, null);
64      }
65  
66      CloseableHttpResponse(final ClassicHttpResponse response, final ExecRuntime execRuntime) {
67          this.response = Args.notNull(response, "Response");
68          this.execRuntime = execRuntime;
69      }
70  
71      @Override
72      public int getCode() {
73          return response.getCode();
74      }
75  
76      @Override
77      public HttpEntity getEntity() {
78          return response.getEntity();
79      }
80  
81      @Override
82      public boolean containsHeader(final String name) {
83          return response.containsHeader(name);
84      }
85  
86      @Override
87      public void setVersion(final ProtocolVersion version) {
88          response.setVersion(version);
89      }
90  
91      @Override
92      public void setCode(final int code) {
93          response.setCode(code);
94      }
95  
96      @Override
97      public String getReasonPhrase() {
98          return response.getReasonPhrase();
99      }
100 
101     @Override
102     public int countHeaders(final String name) {
103         return response.countHeaders(name);
104     }
105 
106     @Override
107     public void setEntity(final HttpEntity entity) {
108         response.setEntity(entity);
109     }
110 
111     @Override
112     public ProtocolVersion getVersion() {
113         return response.getVersion();
114     }
115 
116     @Override
117     public void setReasonPhrase(final String reason) {
118         response.setReasonPhrase(reason);
119     }
120 
121     @Override
122     public Header[] getHeaders(final String name) {
123         return response.getHeaders(name);
124     }
125 
126     @Override
127     public void addHeader(final Header header) {
128         response.addHeader(header);
129     }
130 
131     @Override
132     public Locale getLocale() {
133         return response.getLocale();
134     }
135 
136     @Override
137     public void addHeader(final String name, final Object value) {
138         response.addHeader(name, value);
139     }
140 
141     @Override
142     public void setLocale(final Locale loc) {
143         response.setLocale(loc);
144     }
145 
146     @Override
147     public Header getHeader(final String name) throws ProtocolException {
148         return response.getHeader(name);
149     }
150 
151     @Override
152     public void setHeader(final Header header) {
153         response.setHeader(header);
154     }
155 
156     @Override
157     public Header getFirstHeader(final String name) {
158         return response.getFirstHeader(name);
159     }
160 
161     @Override
162     public void setHeader(final String name, final Object value) {
163         response.setHeader(name, value);
164     }
165 
166     @Override
167     public void setHeaders(final Header... headers) {
168         response.setHeaders(headers);
169     }
170 
171     @Override
172     public boolean removeHeader(final Header header) {
173         return response.removeHeader(header);
174     }
175 
176     @Override
177     public boolean removeHeaders(final String name) {
178         return response.removeHeaders(name);
179     }
180 
181     @Override
182     public Header getLastHeader(final String name) {
183         return response.getLastHeader(name);
184     }
185 
186     @Override
187     public Header[] getHeaders() {
188         return response.getHeaders();
189     }
190 
191     @Override
192     public Iterator<Header> headerIterator() {
193         return response.headerIterator();
194     }
195 
196     @Override
197     public Iterator<Header> headerIterator(final String name) {
198         return response.headerIterator(name);
199     }
200 
201     @Override
202     public void close() throws IOException {
203         if (execRuntime != null) {
204             try {
205                 response.close();
206                 execRuntime.disconnectEndpoint();
207             } finally {
208                 execRuntime.discardEndpoint();
209             }
210         } else {
211             response.close();
212         }
213     }
214 
215     @Override
216     public String toString() {
217         return response.toString();
218     }
219 
220 }