package org.torproject.jtor.circuits.impl;
import org.torproject.jtor.circuits.Circuit;
import org.torproject.jtor.circuits.OpenStreamResponse;
import org.torproject.jtor.logging.Logger;
public class OpenExitStreamTask implements Runnable {
private final Circuit circuit;
private final StreamExitRequest exitRequest;
private final Logger logger;
OpenExitStreamTask(Circuit circuit, StreamExitRequest exitRequest, Logger logger) {
this.circuit = circuit;
this.exitRequest = exitRequest;
this.logger = logger;
}
public void run() {
logger.debug("Attempting to open stream to "+ exitRequest);
final OpenStreamResponse openStreamResponse = tryOpenExitStream();
switch(openStreamResponse.getStatus()) {
case STATUS_STREAM_OPENED:
break;
case STATUS_STREAM_ERROR:
case STATUS_STREAM_TIMEOUT:
circuit.recordFailedExitTarget(exitRequest);
break;
}
exitRequest.setCompleted(openStreamResponse);
}
private OpenStreamResponse tryOpenExitStream() {
if(exitRequest.isAddressTarget())
return circuit.openExitStream(exitRequest.getAddress(), exitRequest.getPort());
else
return circuit.openExitStream(exitRequest.getHostname(), exitRequest.getPort());
}
}