65 lines
1.8 KiB
Java
65 lines
1.8 KiB
Java
package com.jenkov.nioserver.http;
|
|
|
|
import com.jenkov.nioserver.IMessageReader;
|
|
import com.jenkov.nioserver.Message;
|
|
import com.jenkov.nioserver.MessageBuffer;
|
|
import com.jenkov.nioserver.Socket;
|
|
|
|
import java.io.IOException;
|
|
import java.nio.ByteBuffer;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
/**
|
|
* Created by jjenkov on 18-10-2015.
|
|
*/
|
|
public class HttpMessageReader implements IMessageReader {
|
|
|
|
private MessageBuffer messageBuffer = null;
|
|
|
|
private List<Message> completeMessages = new ArrayList<Message>();
|
|
private Message nextMessage = null;
|
|
|
|
public HttpMessageReader() {
|
|
}
|
|
|
|
@Override
|
|
public void init(MessageBuffer readMessageBuffer) {
|
|
this.messageBuffer = readMessageBuffer;
|
|
this.nextMessage = messageBuffer.getMessage();
|
|
this.nextMessage.metaData = new HttpHeaders();
|
|
}
|
|
|
|
@Override
|
|
public void read(Socket socket, ByteBuffer byteBuffer) throws IOException {
|
|
int bytesRead = socket.read(byteBuffer);
|
|
byteBuffer.flip();
|
|
|
|
if(byteBuffer.remaining() == 0){
|
|
byteBuffer.clear();
|
|
return;
|
|
}
|
|
|
|
this.nextMessage.writeToMessage(byteBuffer);
|
|
|
|
int endIndex = HttpUtil.parseHttpRequest(this.nextMessage.sharedArray, this.nextMessage.offset, this.nextMessage.offset + this.nextMessage.length, (HttpHeaders) this.nextMessage.metaData);
|
|
if(endIndex != -1){
|
|
Message message = this.messageBuffer.getMessage();
|
|
message.metaData = new HttpHeaders();
|
|
|
|
message.writePartialMessageToMessage(nextMessage, endIndex);
|
|
|
|
completeMessages.add(nextMessage);
|
|
nextMessage = message;
|
|
}
|
|
byteBuffer.clear();
|
|
}
|
|
|
|
|
|
@Override
|
|
public List<Message> getMessages() {
|
|
return this.completeMessages;
|
|
}
|
|
|
|
}
|