/* * 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); } }