Fix #54
This commit is contained in:
parent
654758c14b
commit
00170748f4
@ -64,7 +64,7 @@ public class HashRequest extends Payload {
|
|||||||
filename = BytesArrayTools.readString(packet, FILENAME_POSITION, filenameSize);
|
filename = BytesArrayTools.readString(packet, FILENAME_POSITION, filenameSize);
|
||||||
|
|
||||||
/* Read algo list */
|
/* Read algo list */
|
||||||
int size = getPayloadSize(packet);
|
int size = getPayloadSize(packet) - filenameSize - (FILENAME_POSITION - PAYLOAD_START_POSITION);
|
||||||
String[] algoListStr = BytesArrayTools.readStringArray(packet, FILENAME_POSITION + filenameSize, size, "\n");
|
String[] algoListStr = BytesArrayTools.readStringArray(packet, FILENAME_POSITION + filenameSize, size, "\n");
|
||||||
int i = 0;
|
int i = 0;
|
||||||
algoList = new HashAlgorithm[algoListStr.length];
|
algoList = new HashAlgorithm[algoListStr.length];
|
||||||
|
@ -28,6 +28,7 @@ import protocolP2P.SizeResponse;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
/** Representation of packet.
|
/** Representation of packet.
|
||||||
* @author Louis Royer
|
* @author Louis Royer
|
||||||
@ -113,11 +114,63 @@ public class ProtocolP2PPacketTCP < T extends Payload > extends ProtocolP2PPacke
|
|||||||
throw new InternalError();
|
throw new InternalError();
|
||||||
}
|
}
|
||||||
Socket ss = (Socket)socket;
|
Socket ss = (Socket)socket;
|
||||||
byte[] packet = new byte[1024];
|
byte[] packetHeader = new byte[Payload.PAYLOAD_START_POSITION];
|
||||||
try {
|
try {
|
||||||
if (-1 == ss.getInputStream().read(packet)) {
|
if (-1 == ss.getInputStream().read(packetHeader, 0, Payload.PAYLOAD_START_POSITION)) {
|
||||||
throw new IOException();
|
throw new IOException();
|
||||||
}
|
}
|
||||||
|
int payloadSize = Payload.getPayloadSize(packetHeader);
|
||||||
|
byte[] packet = Arrays.copyOf(packetHeader, Payload.PAYLOAD_START_POSITION + payloadSize);
|
||||||
|
if (-1 == ss.getInputStream().read(packet, Payload.PAYLOAD_START_POSITION, payloadSize)) {
|
||||||
|
throw new IOException();
|
||||||
|
}
|
||||||
|
// contruction
|
||||||
|
boolean protocolError = false;
|
||||||
|
try {
|
||||||
|
constructPacket(packet, ss);
|
||||||
|
Payload payload = getPayload();
|
||||||
|
switch (payload.getRequestResponseCode()) {
|
||||||
|
case PROTOCOL_ERROR :
|
||||||
|
// we do not want to create an infinite loop of protocolError message exchange.
|
||||||
|
protocolError = true;
|
||||||
|
break;
|
||||||
|
case VERSION_ERROR :
|
||||||
|
case INTERNAL_ERROR :
|
||||||
|
case EMPTY_DIRECTORY :
|
||||||
|
case NOT_FOUND :
|
||||||
|
case EMPTY_FILE:
|
||||||
|
case LOAD_RESPONSE:
|
||||||
|
case LIST_RESPONSE:
|
||||||
|
case HASH_RESPONSE:
|
||||||
|
case DISCOVER_RESPONSE:
|
||||||
|
case NOT_A_TRACKER:
|
||||||
|
case RATIO_RESPONSE:
|
||||||
|
case DENIED:
|
||||||
|
case SIZE_RESPONSE:
|
||||||
|
// we were expecting a request, but we are receiving a response
|
||||||
|
throw new ProtocolError();
|
||||||
|
default :
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} catch (TransmissionError e) {
|
||||||
|
(new ProtocolP2PPacketTCP<Payload>(new Payload(RequestResponseCode.INTERNAL_ERROR))).send(ss);
|
||||||
|
throw e;
|
||||||
|
} catch (ProtocolError e) {
|
||||||
|
(new ProtocolP2PPacketTCP<Payload>(new Payload(RequestResponseCode.PROTOCOL_ERROR))).send(ss);
|
||||||
|
throw e;
|
||||||
|
} catch (VersionError e) {
|
||||||
|
(new ProtocolP2PPacketTCP<Payload>(new Payload(RequestResponseCode.VERSION_ERROR))).send(ss);
|
||||||
|
throw e;
|
||||||
|
} catch (InternalError e) {
|
||||||
|
(new ProtocolP2PPacketTCP<Payload>(new Payload(RequestResponseCode.INTERNAL_ERROR))).send(ss);
|
||||||
|
throw e;
|
||||||
|
} catch (SizeError e) {
|
||||||
|
(new ProtocolP2PPacketTCP<Payload>(new Payload(RequestResponseCode.INTERNAL_ERROR))).send(ss);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
if (protocolError) {
|
||||||
|
throw new ProtocolError();
|
||||||
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
// Error: cannot read request, closing socket
|
// Error: cannot read request, closing socket
|
||||||
try {
|
try {
|
||||||
@ -128,53 +181,6 @@ public class ProtocolP2PPacketTCP < T extends Payload > extends ProtocolP2PPacke
|
|||||||
throw new SocketClosed();
|
throw new SocketClosed();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// contruction
|
|
||||||
boolean protocolError = false;
|
|
||||||
try {
|
|
||||||
constructPacket(packet, ss);
|
|
||||||
Payload payload = getPayload();
|
|
||||||
switch (payload.getRequestResponseCode()) {
|
|
||||||
case PROTOCOL_ERROR :
|
|
||||||
// we do not want to create an infinite loop of protocolError message exchange.
|
|
||||||
protocolError = true;
|
|
||||||
break;
|
|
||||||
case VERSION_ERROR :
|
|
||||||
case INTERNAL_ERROR :
|
|
||||||
case EMPTY_DIRECTORY :
|
|
||||||
case NOT_FOUND :
|
|
||||||
case EMPTY_FILE:
|
|
||||||
case LOAD_RESPONSE:
|
|
||||||
case LIST_RESPONSE:
|
|
||||||
case HASH_RESPONSE:
|
|
||||||
case DISCOVER_RESPONSE:
|
|
||||||
case NOT_A_TRACKER:
|
|
||||||
case RATIO_RESPONSE:
|
|
||||||
case DENIED:
|
|
||||||
case SIZE_RESPONSE:
|
|
||||||
// we were expecting a request, but we are receiving a response
|
|
||||||
throw new ProtocolError();
|
|
||||||
default :
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} catch (TransmissionError e) {
|
|
||||||
(new ProtocolP2PPacketTCP<Payload>(new Payload(RequestResponseCode.INTERNAL_ERROR))).send(ss);
|
|
||||||
throw e;
|
|
||||||
} catch (ProtocolError e) {
|
|
||||||
(new ProtocolP2PPacketTCP<Payload>(new Payload(RequestResponseCode.PROTOCOL_ERROR))).send(ss);
|
|
||||||
throw e;
|
|
||||||
} catch (VersionError e) {
|
|
||||||
(new ProtocolP2PPacketTCP<Payload>(new Payload(RequestResponseCode.VERSION_ERROR))).send(ss);
|
|
||||||
throw e;
|
|
||||||
} catch (InternalError e) {
|
|
||||||
(new ProtocolP2PPacketTCP<Payload>(new Payload(RequestResponseCode.INTERNAL_ERROR))).send(ss);
|
|
||||||
throw e;
|
|
||||||
} catch (SizeError e) {
|
|
||||||
(new ProtocolP2PPacketTCP<Payload>(new Payload(RequestResponseCode.INTERNAL_ERROR))).send(ss);
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
if (protocolError) {
|
|
||||||
throw new ProtocolError();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Send a Response to a Request (typically used from server).
|
/** Send a Response to a Request (typically used from server).
|
||||||
@ -221,11 +227,56 @@ public class ProtocolP2PPacketTCP < T extends Payload > extends ProtocolP2PPacke
|
|||||||
throw new InternalError();
|
throw new InternalError();
|
||||||
}
|
}
|
||||||
// reception
|
// reception
|
||||||
byte[] packet = new byte[8192];
|
byte[] packetHeader = new byte[Payload.PAYLOAD_START_POSITION];
|
||||||
try {
|
try {
|
||||||
if (-1== requestSocket.getInputStream().read(packet)) {
|
if (-1 == requestSocket.getInputStream().read(packetHeader, 0, Payload.PAYLOAD_START_POSITION)) {
|
||||||
throw new IOException();
|
throw new IOException();
|
||||||
}
|
}
|
||||||
|
int payloadSize = Payload.getPayloadSize(packetHeader);
|
||||||
|
byte[] packet = Arrays.copyOf(packetHeader, Payload.PAYLOAD_START_POSITION + payloadSize);
|
||||||
|
if (-1 == requestSocket.getInputStream().read(packet, Payload.PAYLOAD_START_POSITION, payloadSize)) {
|
||||||
|
throw new IOException();
|
||||||
|
}
|
||||||
|
// contruction
|
||||||
|
try {
|
||||||
|
ProtocolP2PPacketTCP<?> p = new ProtocolP2PPacketTCP<>(packet);
|
||||||
|
Payload payload = p.getPayload();
|
||||||
|
switch (payload.getRequestResponseCode()) {
|
||||||
|
case PROTOCOL_ERROR :
|
||||||
|
throw new ProtocolRemoteError();
|
||||||
|
case VERSION_ERROR :
|
||||||
|
throw new VersionRemoteError();
|
||||||
|
case INTERNAL_ERROR :
|
||||||
|
throw new InternalRemoteError();
|
||||||
|
case EMPTY_DIRECTORY :
|
||||||
|
throw new EmptyDirectory();
|
||||||
|
case NOT_FOUND :
|
||||||
|
throw new NotFound();
|
||||||
|
case EMPTY_FILE:
|
||||||
|
throw new EmptyFile();
|
||||||
|
case NOT_A_TRACKER:
|
||||||
|
throw new NotATracker();
|
||||||
|
case UNKNOWN_HOST:
|
||||||
|
throw new UnknownHost();
|
||||||
|
default :
|
||||||
|
return (ProtocolP2PPacket)p;
|
||||||
|
}
|
||||||
|
} catch (TransmissionError e) {
|
||||||
|
(new ProtocolP2PPacketTCP<Payload>(new Payload(RequestResponseCode.INTERNAL_ERROR))).send(requestSocket);
|
||||||
|
throw e;
|
||||||
|
} catch (ProtocolError e) {
|
||||||
|
(new ProtocolP2PPacketTCP<Payload>(new Payload(RequestResponseCode.PROTOCOL_ERROR))).send(requestSocket);
|
||||||
|
throw e;
|
||||||
|
} catch (VersionError e) {
|
||||||
|
(new ProtocolP2PPacketTCP<Payload>(new Payload(RequestResponseCode.VERSION_ERROR))).send(requestSocket);
|
||||||
|
throw e;
|
||||||
|
} catch (InternalError e) {
|
||||||
|
(new ProtocolP2PPacketTCP<Payload>(new Payload(RequestResponseCode.INTERNAL_ERROR))).send(requestSocket);
|
||||||
|
throw e;
|
||||||
|
} catch (SizeError e) {
|
||||||
|
(new ProtocolP2PPacketTCP<Payload>(new Payload(RequestResponseCode.INTERNAL_ERROR))).send(requestSocket);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
// Error: cannot read request, closing socket
|
// Error: cannot read request, closing socket
|
||||||
try {
|
try {
|
||||||
@ -236,46 +287,6 @@ public class ProtocolP2PPacketTCP < T extends Payload > extends ProtocolP2PPacke
|
|||||||
throw new SocketClosed();
|
throw new SocketClosed();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// contruction
|
|
||||||
try {
|
|
||||||
ProtocolP2PPacketTCP<?> p = new ProtocolP2PPacketTCP<>(packet);
|
|
||||||
Payload payload = p.getPayload();
|
|
||||||
switch (payload.getRequestResponseCode()) {
|
|
||||||
case PROTOCOL_ERROR :
|
|
||||||
throw new ProtocolRemoteError();
|
|
||||||
case VERSION_ERROR :
|
|
||||||
throw new VersionRemoteError();
|
|
||||||
case INTERNAL_ERROR :
|
|
||||||
throw new InternalRemoteError();
|
|
||||||
case EMPTY_DIRECTORY :
|
|
||||||
throw new EmptyDirectory();
|
|
||||||
case NOT_FOUND :
|
|
||||||
throw new NotFound();
|
|
||||||
case EMPTY_FILE:
|
|
||||||
throw new EmptyFile();
|
|
||||||
case NOT_A_TRACKER:
|
|
||||||
throw new NotATracker();
|
|
||||||
case UNKNOWN_HOST:
|
|
||||||
throw new UnknownHost();
|
|
||||||
default :
|
|
||||||
return (ProtocolP2PPacket)p;
|
|
||||||
}
|
|
||||||
} catch (TransmissionError e) {
|
|
||||||
(new ProtocolP2PPacketTCP<Payload>(new Payload(RequestResponseCode.INTERNAL_ERROR))).send(requestSocket);
|
|
||||||
throw e;
|
|
||||||
} catch (ProtocolError e) {
|
|
||||||
(new ProtocolP2PPacketTCP<Payload>(new Payload(RequestResponseCode.PROTOCOL_ERROR))).send(requestSocket);
|
|
||||||
throw e;
|
|
||||||
} catch (VersionError e) {
|
|
||||||
(new ProtocolP2PPacketTCP<Payload>(new Payload(RequestResponseCode.VERSION_ERROR))).send(requestSocket);
|
|
||||||
throw e;
|
|
||||||
} catch (InternalError e) {
|
|
||||||
(new ProtocolP2PPacketTCP<Payload>(new Payload(RequestResponseCode.INTERNAL_ERROR))).send(requestSocket);
|
|
||||||
throw e;
|
|
||||||
} catch (SizeError e) {
|
|
||||||
(new ProtocolP2PPacketTCP<Payload>(new Payload(RequestResponseCode.INTERNAL_ERROR))).send(requestSocket);
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Private constructor with packet as byte[] parameter (typically used when receiving Packet response).
|
/** Private constructor with packet as byte[] parameter (typically used when receiving Packet response).
|
||||||
|
Loading…
Reference in New Issue
Block a user