/*
* Created by Andrey Cherkashin (acherkashin)
* http://acherkashin.me
*
* License
* Copyright (c) 2015 Andrey Cherkashin
* The project released under the MIT license: http://opensource.org/licenses/MIT
*/
package ragefist.core.network;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author acherkashin
*/
public class SocketStrategyHTTP implements ISocketStrategy
{
private final static ISocketStrategy _instance = new SocketStrategyHTTP();
public static final ISocketStrategy getInstance() { return _instance; }
@Override
public byte[][] readPackets(SocketClient socket, ByteBuffer readBuffer) throws IOException {
PacketBufferHTTP packetBuffer = (PacketBufferHTTP)socket.getPacketBuffer(PacketBufferHTTP.class);
List<byte[]> packets = new ArrayList<>();
int bytesRead;
while ((bytesRead = socket.read(readBuffer)) > 0) {
readBuffer.flip();
byte[] bytes = new byte[readBuffer.remaining()];
readBuffer.get(bytes, 0, readBuffer.remaining());
packetBuffer.put(bytes);
readBuffer.compact();
while(true) {
if (packetBuffer.isBody()) {
if (true == packetBuffer.isBodyReady()) {
packetBuffer.readBody();
packets.add(packetBuffer.getBody());
}
break;
} else {
if (false == packetBuffer.readLine()) {
break;
}
}
}
}
byte[][] array = new byte[packets.size()][];
for(int i = 0; i < array.length; i++) {
byte[] byteArray = packets.get(i);
array[i] = byteArray;
}
return array;
}
@Override
public int writePacket(SocketClient socket, String packet) throws IOException {
StringBuilder response = new StringBuilder();
response.append("HTTP/1.1 200 OK\r\n");
response.append("Connection: close\r\n");
response.append("Server: Ragefist\r\n");
response.append("Content-Length: "+packet.length()+"\r\n");
response.append("\r\n");
response.append(packet);
int written = socket.write(Charset.defaultCharset().encode(response.toString()));
socket.close();
return written;
}
@Override
public int writePacket(SocketClient socket, byte[] bytes) throws IOException {
ByteBuffer buffer = ByteBuffer.wrap(bytes);
String data = Charset.defaultCharset().decode(buffer).toString();
return this.writePacket(socket, data);
}
}