Получение бинарной полезной нагрузки HTTP POST в байтовый массив в Scala - PullRequest
2 голосов
/ 26 ноября 2011

У меня есть розетка, которая будет существовать долго.Клиент будет продолжать передавать запросы данных на мое серверное приложение через сокет.Запрос - это POST с двоичной полезной нагрузкой, которую нужно скопировать в байтовый массив, который мне нужно использовать для получения класса буфера протокола.

POST / HTTP/1.1
Host: 127.0.0.1:80
Accept-Encoding: identity
Content-Length: 423
Content-type: application/octet-stream

[PAYLOAD]

val out = new DataOutputStream(socket.getOutputStream())
val in = new BufferedReader(new InputStreamReader(socket.getInputStream()))

Есть идеи?

ОБНОВЛЕНИЕ - я получил временное решение с использованием УСТАРЕВШЕЙ Java-функции - DataInputStream.readLine.

Может кто-нибудь улучшить этот код?

val in = new DataInputStream(socket.getInputStream())
var n:Int = 0
var size:Int=0
while (n==0) {
    var str=in.readLine
    if(str==""){
        n =1
    }else{
        val breaks=str.split(" ")
        if(breaks(0).equals("Content-Length:"))size=breaks(1).toInt
    }
}
var payload:Array[Byte]=new Array(size)
n=size-1
for(i <- 0 to n) payload(i)=in.readByte

1 Ответ

0 голосов
/ 03 декабря 2011

Если запрос находится под вашим контролем и является каноническим, вы можете проанализировать его следующим образом

    static String pattern="Content-Length: ";

private static boolean readContentLength(InputStream in,int current) throws IOException
{
    int k=in.read();
    char read=(char)k ;
    if(k==-1)
        throw new IOException("-1");
    if( read!=pattern.charAt(current))
    {
        return false;
    }
    else
    {
        if(current==pattern.length()-1)
            return true;
        else
            return readContentLength(in,current+1);
    }
}

public static void main(String...args)throws Exception
{
    byte[] bs= ("POST / HTTP/1.1\r\n"+
            "Host: 127.0.0.1:80\r\n"+
            "Accept-Encoding: identity\r\n"+
            "Content-Length: 423\r\n"+
            "Content-type: application/octet-stream\r\n").getBytes();

    InputStream is=new ByteArrayInputStream(bs);

    while(readContentLength(is,0)==false)
    {

    }
    StringBuilder lengthSb=new StringBuilder();
    char c=(char) is.read();
    while('0'<=c&&c<='9')
    {
        lengthSb.append(c);
        c=(char)is.read();
    }
    int length=Integer.valueOf(lengthSb.toString());
    System.out.println(length);

}
...