blob: 92aa2165351f9f83e9028e9ad144f9e100bcb34d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2013 Tasktop Technologies and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.commons.repositories.http.core;
import java.io.IOException;
import java.io.InputStream;
import org.apache.http.HttpEntity;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.util.EntityUtils;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.mylyn.commons.core.operations.CancellableOperationMonitorThread;
import org.eclipse.mylyn.commons.core.operations.ICancellableOperation;
import org.eclipse.mylyn.commons.core.operations.IOperationMonitor;
import org.eclipse.mylyn.commons.core.operations.OperationUtil;
/**
* @author Steffen Pingel
*/
public class CommonHttpResponse implements ICancellableOperation {
private CancellableInputStream entityStream;
private final IOperationMonitor monitor;
private final HttpRequest request;
private final HttpResponse response;
private final CancellableOperationMonitorThread monitorThread;
public CommonHttpResponse(HttpRequest request, HttpResponse response,
CancellableOperationMonitorThread monitorThread, IOperationMonitor monitor) {
Assert.isNotNull(request);
Assert.isNotNull(response);
Assert.isNotNull(monitorThread);
Assert.isNotNull(monitor);
this.request = request;
this.response = response;
this.monitorThread = monitorThread;
this.monitor = monitor;
}
public CommonHttpResponse(HttpRequest request, HttpResponse response, IOperationMonitor monitor) {
this(request, response, CancellableOperationMonitorThread.getInstance(), monitor);
}
/**
* @deprecated use
* {@link CommonHttpResponse#CommonHttpResponse(HttpRequest, HttpResponse, CancellableOperationMonitorThread, IOperationMonitor)
*/
@Deprecated
public CommonHttpResponse(HttpRequest request, HttpResponse response) {
this(request, response, CancellableOperationMonitorThread.getInstance(), OperationUtil.convert(null));
}
@Override
public void abort() {
abortStream();
if (request instanceof HttpUriRequest) {
try {
((HttpUriRequest) request).abort();
} catch (UnsupportedOperationException e) {
}
}
}
public HttpRequest getRequest() {
return request;
}
public String getRequestPath() {
if (request instanceof HttpUriRequest) {
return ((HttpUriRequest) request).getURI().getPath();
} else {
return null;
}
}
public HttpResponse getResponse() {
return response;
}
public String getResponseCharSet() {
return EntityUtils.getContentCharSet(response.getEntity());
}
public synchronized InputStream getResponseEntityAsStream() throws IOException {
if (entityStream != null) {
throw new IllegalStateException();
}
HttpEntity entity = response.getEntity();
if (entity == null) {
throw new IOException("Expected entity"); //$NON-NLS-1$
}
entityStream = new CancellableInputStream(this, entity.getContent());
monitorThread.addOperation(this);
return entityStream;
}
/**
* @deprecated use {@link #getResponseEntityAsStream()} instead
*/
@Deprecated
public InputStream getResponseEntityAsStream(IProgressMonitor monitor) throws IOException {
return getResponseEntityAsStream();
}
public int getStatusCode() {
return response.getStatusLine().getStatusCode();
}
@Override
public boolean isCanceled() {
return monitor.isCanceled();
}
public void release() {
releaseStream();
HttpUtil.release(request, response, monitor);
}
/**
* @deprecated use {@link #release()} instead
*/
@Deprecated
public void release(IProgressMonitor monitor) {
release();
}
private synchronized void abortStream() {
if (entityStream != null) {
CancellableOperationMonitorThread.getInstance().removeOperation(this);
entityStream.cancel();
}
}
private synchronized void releaseStream() {
if (entityStream != null) {
CancellableOperationMonitorThread.getInstance().removeOperation(this);
entityStream = null;
}
}
void notifyStreamClosed() {
release();
}
}