001/*
002 * ====================================================================
003 * Licensed to the Apache Software Foundation (ASF) under one
004 * or more contributor license agreements.  See the NOTICE file
005 * distributed with this work for additional information
006 * regarding copyright ownership.  The ASF licenses this file
007 * to you under the Apache License, Version 2.0 (the
008 * "License"); you may not use this file except in compliance
009 * with the License.  You may obtain a copy of the License at
010 *
011 *   http://www.apache.org/licenses/LICENSE-2.0
012 *
013 * Unless required by applicable law or agreed to in writing,
014 * software distributed under the License is distributed on an
015 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
016 * KIND, either express or implied.  See the License for the
017 * specific language governing permissions and limitations
018 * under the License.
019 * ====================================================================
020 *
021 * This software consists of voluntary contributions made by many
022 * individuals on behalf of the Apache Software Foundation.  For more
023 * information on the Apache Software Foundation, please see
024 * <http://www.apache.org/>.
025 *
026 */
027
028package org.apache.http.impl.execchain;
029
030import java.io.IOException;
031import java.util.Locale;
032
033import org.apache.http.Header;
034import org.apache.http.HeaderIterator;
035import org.apache.http.HttpEntity;
036import org.apache.http.HttpResponse;
037import org.apache.http.ProtocolVersion;
038import org.apache.http.StatusLine;
039import org.apache.http.client.methods.CloseableHttpResponse;
040import org.apache.http.params.HttpParams;
041
042/**
043 * A proxy class for {@link org.apache.http.HttpResponse} that can be used to release client connection
044 * associated with the original response.
045 *
046 * @since 4.3
047 */
048class HttpResponseProxy implements CloseableHttpResponse {
049
050    private final HttpResponse original;
051    private final ConnectionHolder connHolder;
052
053    public HttpResponseProxy(final HttpResponse original, final ConnectionHolder connHolder) {
054        this.original = original;
055        this.connHolder = connHolder;
056        ResponseEntityProxy.enchance(original, connHolder);
057    }
058
059    @Override
060    public void close() throws IOException {
061        if (this.connHolder != null) {
062            this.connHolder.close();
063        }
064    }
065
066    @Override
067    public StatusLine getStatusLine() {
068        return original.getStatusLine();
069    }
070
071    @Override
072    public void setStatusLine(final StatusLine statusline) {
073        original.setStatusLine(statusline);
074    }
075
076    @Override
077    public void setStatusLine(final ProtocolVersion ver, final int code) {
078        original.setStatusLine(ver, code);
079    }
080
081    @Override
082    public void setStatusLine(final ProtocolVersion ver, final int code, final String reason) {
083        original.setStatusLine(ver, code, reason);
084    }
085
086    @Override
087    public void setStatusCode(final int code) throws IllegalStateException {
088        original.setStatusCode(code);
089    }
090
091    @Override
092    public void setReasonPhrase(final String reason) throws IllegalStateException {
093        original.setReasonPhrase(reason);
094    }
095
096    @Override
097    public HttpEntity getEntity() {
098        return original.getEntity();
099    }
100
101    @Override
102    public void setEntity(final HttpEntity entity) {
103        original.setEntity(entity);
104    }
105
106    @Override
107    public Locale getLocale() {
108        return original.getLocale();
109    }
110
111    @Override
112    public void setLocale(final Locale loc) {
113        original.setLocale(loc);
114    }
115
116    @Override
117    public ProtocolVersion getProtocolVersion() {
118        return original.getProtocolVersion();
119    }
120
121    @Override
122    public boolean containsHeader(final String name) {
123        return original.containsHeader(name);
124    }
125
126    @Override
127    public Header[] getHeaders(final String name) {
128        return original.getHeaders(name);
129    }
130
131    @Override
132    public Header getFirstHeader(final String name) {
133        return original.getFirstHeader(name);
134    }
135
136    @Override
137    public Header getLastHeader(final String name) {
138        return original.getLastHeader(name);
139    }
140
141    @Override
142    public Header[] getAllHeaders() {
143        return original.getAllHeaders();
144    }
145
146    @Override
147    public void addHeader(final Header header) {
148        original.addHeader(header);
149    }
150
151    @Override
152    public void addHeader(final String name, final String value) {
153        original.addHeader(name, value);
154    }
155
156    @Override
157    public void setHeader(final Header header) {
158        original.setHeader(header);
159    }
160
161    @Override
162    public void setHeader(final String name, final String value) {
163        original.setHeader(name, value);
164    }
165
166    @Override
167    public void setHeaders(final Header[] headers) {
168        original.setHeaders(headers);
169    }
170
171    @Override
172    public void removeHeader(final Header header) {
173        original.removeHeader(header);
174    }
175
176    @Override
177    public void removeHeaders(final String name) {
178        original.removeHeaders(name);
179    }
180
181    @Override
182    public HeaderIterator headerIterator() {
183        return original.headerIterator();
184    }
185
186    @Override
187    public HeaderIterator headerIterator(final String name) {
188        return original.headerIterator(name);
189    }
190
191    @Override
192    @Deprecated
193    public HttpParams getParams() {
194        return original.getParams();
195    }
196
197    @Override
198    @Deprecated
199    public void setParams(final HttpParams params) {
200        original.setParams(params);
201    }
202
203    @Override
204    public String toString() {
205        final StringBuilder sb = new StringBuilder("HttpResponseProxy{");
206        sb.append(original);
207        sb.append('}');
208        return sb.toString();
209    }
210
211}