HTTP No request data found

Yissu

Mitglied
Hallo Leute,

Ich hab ein kleines Problem ich versuch gerade ein kleinen Webserver zu schreiben allerdings bekomme ich immer diese Fehlermeldung:
java.lang.IllegalArgumentException: No request data found

Java:
package com.yissugames.web;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Webserver {

	public Webserver(int port)
	{
		try {
			final ServerSocket socket = new ServerSocket(port);
			
			for(;;) {
				final Socket clientSocket = socket.accept();
				
				final HTTPWorker httpWorker = new HTTPWorker(clientSocket);
				(new Thread(httpWorker)).run();
			}
		} catch (IOException e) {
			e.printStackTrace();
			System.exit(1);
		}
	}
	
	public static void main(String[] args)
	{
		int port = 80;
		if(args.length == 1) 
		{
			if(isInteger(args[0]))
			{
				port = Integer.parseInt(args[0]);
			}
		}
		
		new Webserver(port);
	}
	
	private static boolean isInteger(String s)
	{
		try{
			Integer.parseInt(s);
			return true;
		} catch (Exception e) {
			return false;
		}
	}
	
}

class HTTPWorker implements Runnable
{
	private Socket clientSocket;
	
	public HTTPWorker(final Socket clientSocket)
	{
		this.clientSocket = clientSocket;
	}
	
	@Override
	public void run() {
		System.out.println("====================");
		
		try {
			final InputStream is = clientSocket.getInputStream();
			
			final int bytesToRead = is.available();
			
			if(bytesToRead == 0) {
				throw new IllegalArgumentException("No request data found");
			}
			
			final byte[] barray = new byte[bytesToRead];
			is.read(barray, 0, bytesToRead);
			final String client_data = new String(barray);
			
			final String regex = ".*GET (.*) HTTP.*";
			final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE | Pattern.DOTALL);
			final Matcher matcher = pattern.matcher(client_data);
			
			if(matcher.matches()) {
				final String requestedPage = matcher.group(1);
				
				final String content = "";
				final String data = buildHeader(content.length(), "404 Not Found");
				
				clientSocket.getOutputStream().write(data.getBytes());
				clientSocket.getOutputStream().write(content.getBytes());
				System.out.println("404-Error");
			}
		} catch (final Exception e) {
			e.printStackTrace();
			
			final String content = "<html><head><title>500 - Internal Server Error</title></head><body><h1>500 - Internal Server Error</h1>" + e.getMessage() + "<br /><pre>" + stackTraceToString(e.getStackTrace()) + "</pre></body></html>";
			final String data = buildHeader(content.length(), "500 Internal Server Error");
			
			try {
				clientSocket.getOutputStream().write(data.getBytes());
				clientSocket.getOutputStream().write(content.getBytes());
				System.out.println("Server-Error");
			} catch (final Exception e2) {
				System.out.println("Can't answere to server");
			}
		} 
		
		System.out.println("====================");
	}
	
	private String buildHeader(final int stringLength, final String httpState)
	{
		return "HTTP/1.1 " + httpState + "\n" + "Content-Length: "
				+ stringLength + "\n" + "Content-Type: text/html\n"
				+ "Connection: close\n\n";
	}
	
	private String stackTraceToString(StackTraceElement[] stacktrace)
	{
		StringBuilder builder = new StringBuilder();
		for(StackTraceElement element: stacktrace)
		{
			builder.append(element);
			builder.append(System.getProperty("line.separator"));
		}
		return builder.toString(); 
	}
	
	private void closeSocketNE()
	{
		try 
		{
			clientSocket.close();
		} catch(IOException e) {
			e.printStackTrace();
		}
	}
}
 
T

trääät

Gast
gut .. auch wenn der user gesperrt wurde (yeah .. ich kenn das ja irgendwoher ...) vielleicht liest er die antwort trotzdem

InputStream.available() gibt eine grobe schätzung zurück wie viele bytes beim nächsten call von InputStream.read() bzw InputStream.skip() OHNE blockieren gelesen / geskipt werden können ...

da du diese methode direkt nach dem erzeugen des InputStreams aufrufst kann es sein das der input-buffer einfach noch keine daten bzw zu wenig daten enthält um beim nächsten call von read() ohne blockierung weiter zu machen ...

warum du hier überhaupt InputStream.available() callst ist mir ein rätzel ... denn in der regel beginnt man dierekt von einem InputStream zu lesen anstatt gleich nach erzeugen des objektes zu gucken ob man denn schon ohne i/o-block lesen kann ...

schmeiß die zeile also einfach raus und lies stattdessen ein byte-array von sagen wir 8kb ein .. das sollte für ne normale GET-anfrage dicke ausreichen ...

mal ganz davon abgesehen das dein code eh mist ist ...

beispiel : wenn InputStream.available() so arbeiten sollte wie du es hier verwenden willst ... was würdest du machen wenn ich dir im request mal eben 4GB payload schicke ?

1) ein INT kann nur max 2^31-1 darstellen ... was rund 2GB und n bisschen sind ...
2) dein code ist so aufgebaut das du alles gleichzeitig auf einmal in den RAM lesen willst ... solltest du also payload unterstützen wollen müsstest du , da mehrere threads , ein weit aus vielfaches an RAM deiner VM zuweisen ... womit man das ganze system lahmlegen kann (stichwort DDoS)
3) im falle das NICH GET kommt machst du einfach gar nichts ... richtiger weise müsste aber HTTP 501 NOT IMPLEMENTED kommen ...
 

Lumaraf

Bekanntes Mitglied
Wie trääät schon richtig angemerkt hat solltest du besser ohne InputStream#available() arbeiten. Lies einfach solange Daten aus dem InputStream bis direkt nacheinander zwei Zeilenumbrüche (also eine Leerzeile) bekommst. Als Zeilenumbruch ist in HTTP übrigens \r\n definiert. Wenn du nur \n sendest wird das sehr warscheinlich in einigen Clients Probleme machen. Ansonsten fällt mir noch ein Fehler bei dem Content-Length Header auf: du sendest die Anzahl der Zeichen im String, es muß dort aber die Anzahl der bytes in der Antwort kommen. (je nach Zeichensatz gibt es da kleinere oder größere Abweichungen)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Thallius HTTP Kann man den Raw HTTPS Request irgendwie ausgeben lassen? Netzwerkprogrammierung 6
O HTTP Wer hilft mit meinem UTF-8 http Request ? Netzwerkprogrammierung 1
J API Aufruf mit GET Request und HMAC Netzwerkprogrammierung 3
M HTTP PATCH Request mit Java ausführen Netzwerkprogrammierung 2
N Post u Head Request an Server Netzwerkprogrammierung 4
M http request and response Netzwerkprogrammierung 0
J Json von Html request einlesen Netzwerkprogrammierung 0
T curl request in java umwandeln Netzwerkprogrammierung 4
S PUT-Request Netzwerkprogrammierung 0
P Java Deauth / Deauthentication request Netzwerkprogrammierung 10
C Android: Json-POST Request zu REST Webservice Netzwerkprogrammierung 2
R Seltsames Verhalten bei GET Request Netzwerkprogrammierung 7
B Socket HTTP-Request führt zu Endlosschleife Netzwerkprogrammierung 5
B Post Request in Java Netzwerkprogrammierung 11
D OT JavaScript JQuery AJAX Request Netzwerkprogrammierung 2
R HTTP Apache HTTP Client: Request mit angehängter Datei Netzwerkprogrammierung 2
O Http request Netzwerkprogrammierung 7
T HTTP POST Request Netzwerkprogrammierung 3
E HTTP Request? Netzwerkprogrammierung 4
L Body eines http Request auslesen Netzwerkprogrammierung 2
K Ende eines HTTP Response/Request Netzwerkprogrammierung 6
D http request Netzwerkprogrammierung 11
ARadauer POST Request absetzen.. Netzwerkprogrammierung 3
J GET Request Netzwerkprogrammierung 1
hdi POST Request (HttpConnection) Netzwerkprogrammierung 6
G HTTP-Request InputStream-Problem Netzwerkprogrammierung 5
J 403 error bei POST request Netzwerkprogrammierung 3
G auf http-request antworten. Netzwerkprogrammierung 3
G JMS Objektzugriff Request Reply erzeugt lediglich Kopie Netzwerkprogrammierung 4
L Java HTTP Request Netzwerkprogrammierung 3
S HTTP Request erstellen Netzwerkprogrammierung 2
K Bad Request nach Form Login in Jakarta HttpClient Netzwerkprogrammierung 4
B lange Strings in http-Request? Netzwerkprogrammierung 3
M erst POST dann Http-Request über URLConnection Netzwerkprogrammierung 3
m@nu Ende von Stream bei HTTP-Request Netzwerkprogrammierung 3
D HTTP Request erstellen (Form Name übergeben!) Netzwerkprogrammierung 3
P Easy Http Request Netzwerkprogrammierung 9
A HTTPS-Request via Proxy mit Konfigurationsskript Netzwerkprogrammierung 3
J HTTP-POST-Request mit Anhang über Socket Netzwerkprogrammierung 2
Z HTTP Request Netzwerkprogrammierung 3
A http request per socket an apache server Netzwerkprogrammierung 5
M Ein HTTP-request aus Java heraus senden Netzwerkprogrammierung 3
J HTTP Request Netzwerkprogrammierung 2
B Laden einer *.csv Datei von einem Webserver (http-request) Netzwerkprogrammierung 8
C dhcp request Netzwerkprogrammierung 16
D Bad Request bei Dateiload Netzwerkprogrammierung 2
X mehrere Request über eine HttpURLConnection Netzwerkprogrammierung 2
G Http Request Netzwerkprogrammierung 2
E FTP FTPS Server gibt Fehlernachricht "522 SSL/TLS required on the data channel" zurück Netzwerkprogrammierung 1
M RMI AbstractTableModel als Data Transfer Object (DTO) nutzen Netzwerkprogrammierung 0
T Jpcap: Packet.data = ? Netzwerkprogrammierung 3
E rmic - class not Found Netzwerkprogrammierung 2
P No trusted certificate found Netzwerkprogrammierung 3
A No trusted certificate found Netzwerkprogrammierung 7
R "Class not found" trotz gesetztem CLASSPATH Netzwerkprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben