Java PHP FastCGI SocketException: сброс соединения при чтении данных

Я пытаюсь написать соединение php-cgi для разрабатываемого веб-сервера Java, но на самом деле оно не работает.

В настоящее время я пытаюсь написать клиент fastcgi, используя этот клиент php в качестве примера https://github.com/adoy/PHP-FastCGI-Client/blob/master/src/Adoy/FastCGI/Client.php

Мне как-то удалось заставить php-cgi разобрать php файлы из моего запроса. Тем не менее, только около 1 из 4 запросов вроде бы успешно выполняется, а затем не удается, когда я пытаюсь прочитать больше данных:

java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at com.bit_stab.fastcgi.client.Packet.<init>(Packet.java:26)
at com.bit_stab.fastcgi.client.Client.readResponse(Client.java:51)
at com.bit_stab.webdragonplugin.php.PHPPlugin.runPhpCgi(PHPPlugin.java:98)
at com.bit_stab.webdragonplugin.php.PHPPlugin.main(PHPPlugin.java:42)

Остальные просто завалили

java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at com.bit_stab.fastcgi.client.Packet.<init>(Packet.java:37)
at com.bit_stab.fastcgi.client.Client.readResponse(Client.java:46)
at com.bit_stab.webdragonplugin.php.PHPPlugin.runPhpCgi(PHPPlugin.java:98)
at com.bit_stab.webdragonplugin.php.PHPPlugin.main(PHPPlugin.java:42)

В настоящее время я запускаю php-cgi из командной строки с php-cgi -b 127.0.0.1:8091 И я использую этот код для проверки:

public static void main(String[] args)
{
try
{
HashMap<String, String> map = new HashMap<String, String>();

map.put( "DOCUMENT_ROOT" , "D:/Programma's/Eclipse/Workspaces/Java/HTTPWebServer/test root" );
map.put( "SCRIPT_FILENAME" , "D:/Programma's/Eclipse/Workspaces/Java/HTTPWebServer/test root/index.php" );
map.put( "SCRIPT_NAME" , "/index.php" );
map.put( "DOCUMENT_URI" , "/index.php" );
map.put( "REQUEST_METHOD" , "GET" );
map.put( "SERVER_PROTOCOL" , "HTTP/1.1" );
map.put( "REDIRECT_STATUS" , "200" );
map.put( "PHP_SELF" , "/index.php" );
map.put( "HOME" , "D:/Programma's/Eclipse/Workspaces/Java/HTTPWebServer/test root" );
map.put( "FCGI_ROLE" , "RESPONDER" );
map.put( "HTTP_CONNECTION" , "keep-alive" );Client c = new Client( "127.0.0.1" , 8090 );
c.asyncRequest( map , "GET /index.php HTTP/1.1\r\nConnection: Keep-Alive\r\n\r\n" );
c.readResponse();
}
catch( Exception e )
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}

Это Client.java

package com.bit_stab.fastcgi.client;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Map;
import java.util.Map.Entry;

public class Client
{
private Socket socket;
private short reqId = 0b0; //TODO singleton requestID counter

public Client( String host, int port ) throws UnknownHostException, IOException
{
socket = new Socket( host, port );
}

public short asyncRequest( Map<String, String> params, String content ) throws IOException
{
ByteArrayOutputStream paramBytes = new ByteArrayOutputStream();

for ( Entry<String, String> param: params.entrySet() )
paramBytes.write( nvpair( param.getKey() , param.getValue() ) );

Packet beginRequest = new Packet( (byte) 1, reqId, new byte[] { 0, 1, 1, 0, 0, 0, 0, 0 } );
Packet requestParams = new Packet( (byte) 4, reqId, paramBytes.toByteArray() );
Packet requestContent = new Packet( (byte) 5, reqId, content.getBytes() );

OutputStream stream = socket.getOutputStream();

stream.write( beginRequest.getBytes() );
stream.write( requestParams.getBytes() );
stream.write( requestContent.getBytes() );

return reqId++;
}

public void readResponse() throws IOException
{
InputStream stream = socket.getInputStream();

Packet response = new Packet( stream );

System.out.println( new String( response.getContent() ) );

Packet p;
while ( ( p = new Packet( stream ) ).getType() != 3 )
System.out.println( new String( p.getContent() ) );
}

public byte[] nvpair( String name, String value )
{
try
{
int nl = name.length();
int vl = value.length();

ByteArrayOutputStream bytes = new ByteArrayOutputStream( nl + vl + 10 );

if ( nl < 256 )
bytes.write( (byte) nl );
else
bytes.write( new byte[] { b( nl >> 24 ), b( nl >> 16 ), b( nl >> 8 ), b( nl ) } );

if ( vl < 256 )
bytes.write( (byte) vl );
else
bytes.write( new byte[] { b( vl >> 24 ), b( vl >> 16 ), b( vl >> 8 ), b( vl ) } );

bytes.write( name.getBytes( "UTF-8" ) );
bytes.write( value.getBytes( "UTF-8" ) );

return bytes.toByteArray();
}
catch( IOException e )
{
e.printStackTrace();
}
return null;
}

public byte b( int i )
{
return (byte) i;
}
}

и это Packet.java

package com.bit_stab.fastcgi.client;

import java.io.IOException;
import java.io.InputStream;

public class Packet
{
private byte version = 1;
private byte type;
private short requestId;
private byte paddingLength = 0;
private byte reserved = 0;

private byte[] content;

public Packet( byte type, short requestId, byte... content )
{
this.type = type;
this.requestId = requestId;
this.content = content;
}

public Packet( InputStream stream ) throws IOException
{
byte[] head = new byte[8];
stream.read( head );

this.version = head[0];
this.type = head[1];
this.requestId = (short)( ( ( head[2] & 0xFF ) << 8 ) | ( head[3] & 0xFF ) );
int contentLength =     ( ( ( head[4] & 0xFF ) << 8 ) | ( head[5] & 0xFF ) );
this.paddingLength = head[6];
this.reserved = head[7];

this.content = new byte[contentLength];

stream.read( content );
stream.skip( paddingLength & 0xFF );
}

public byte getType()
{
return type;
}

public short getId()
{
return requestId;
}

public byte[] getContent()
{
return content;
}

public byte[] getBytes()
{
byte[] b = new byte[8 + content.length];

b[0] = version;
b[1] = type;
b[2] = (byte) ( requestId >> 8 );
b[3] = (byte) requestId;
b[4] = (byte) ( content.length >> 8 );
b[5] = (byte) content.length;
b[6] = paddingLength;
b[7] = reserved;

for ( int i = 0; i < content.length; i++ )
b[i + 8] = content[i];

return b;
}
}

Я использую Java 8 и неотредактированный PHP 5.6.1 из windows.php.net

Что здесь не так и как я могу это исправить?

1

Решение

Я узнал, что это было, я отправлял контент без длины контента, и это не понравилось.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector