# Applet request unter Linux



## Sued_Faust (10. Aug 2010)

Moin,

da bin ich wieder mit meinem Applet. Mein Problem ist, dass ich unter Linux, mit meinem Applet, beim senden eines POST requests, einen http 400 ErrorCode bekomme. Unter Windows dagegen funktioniert alles einwandfrei.
Muss man unter Linux beim Senden auf irgendetwas acht geben?

Gruß


----------



## homer65 (10. Aug 2010)

Merkwürdig. Hier jedenfalls mal was der Code 400 bedeutet:

10.4.1 400 Bad Request

The request could not be understood by the server due to malformed syntax. The client SHOULD NOT repeat the request without modifications. 

Hilft aber wahrscheinlich nicht wirklich.


----------



## Sued_Faust (10. Aug 2010)

Leider nicht. Im Grunde bedeutet es ja, dass ich meine Anfrage an den Server falsch stelle. Aber das kann ja nicht stimmen, zumindest aus der sicht, dass es von einem Windows-Client funktioniert.
Ich hab mir auch schon über Firebug die entsprechende Post-Method von Linux-Client angeschaut und die ist gleich der meinen.


----------



## homer65 (10. Aug 2010)

Kann aber sein, das Linux und Windows unterschiedliche Zeichensätze haben.
Ich weiss ja nicht wie du den Request aufbaust.


----------



## Sued_Faust (10. Aug 2010)

Das könnte es sein. Ich benutze die writeBytes-Methode für die request, ich bin mir da nicht sicher, aber ich glaube sie schreibt in ASCII. Wie kann ich denn in alternative die Methode writeUTF8 nutzen? Geht das einfach so?


----------



## homer65 (10. Aug 2010)

Zeig doch mal einen Auszug aus dem Quelltext


----------



## Sued_Faust (13. Aug 2010)

Moin,

tut mir leid für die verspätete Antwort , hatte noch ein dringendes Projekt zu bearbeiten.

hier mal ein wenig Quellcode meines rquests:


```
public void run(Connection conn, JSParameter jSPara, String boundary,
			JProgressBar pb, int fileIndex) throws IOException,
			PrivilegedActionException {
		this.JSPara = jSPara;
		this.boundary = boundary;
		this.pb = pb;
		this.fileIndex = fileIndex;

		// Zum schreiben der Daten.
		os = conn.getConnection().getOutputStream();
		dos = new DataOutputStream(os);

		writeLine(lineSep + lineSep);
		writeLine(twoStrings + boundary);
		writeLine(lineSep);
		writeLine("Content-Disposition: form-data; name=\"siteId\"" + lineSep
				+ lineSep);
		writeLine(JSPara.getSiteID() + lineSep);
		writeLine(twoStrings + boundary + lineSep);
		writeLine("Content-Disposition: form-data; name=\"containerId\""
				+ lineSep + lineSep);
		writeLine(JSPara.getContainerID() + lineSep);
		writeLine(twoStrings + boundary + lineSep);
		writeLine("Content-Disposition: form-data; name=\"destination\""
				+ lineSep + lineSep);
		writeLine("" + lineSep);
		writeLine(twoStrings + boundary + lineSep);
		writeLine("Content-Disposition: form-data; name=\"username\"" + lineSep
				+ lineSep);
		writeLine("" + lineSep);
		writeLine(twoStrings + boundary + lineSep);
		writeLine("Content-Disposition: form-data; name=\"updateNodeRef\""
				+ lineSep + lineSep);
		writeLine(JSPara.getUpdatenoderef() + lineSep);
		writeLine(twoStrings + boundary + lineSep);
		writeLine("Content-Disposition: form-data; name=\"uploadDirectory\""
				+ lineSep + lineSep);
		writeLine(JSPara.getUploadDirectory() + lineSep);
		writeLine(twoStrings + boundary + lineSep);
		writeLine("Content-Disposition: form-data; name=\"overwrite\""
				+ lineSep + lineSep);
		writeLine(JSPara.getOverwrite() + lineSep);
		writeLine(twoStrings + boundary + lineSep);
		writeLine("Content-Disposition: form-data; name=\"thumbnails\""
				+ lineSep + lineSep);
		writeLine(JSPara.getThumbnails() + lineSep);
		writeLine(twoStrings + boundary + lineSep);
		writeLine("Content-Disposition: form-data; name=\"contentType\""
				+ lineSep + lineSep);
		writeLine("cm:content" + lineSep);
		writeLine(twoStrings + boundary + lineSep);
		writeLine("Content-Disposition: form-data; name=\"filedata\"; filename="
				+ "\""
				+ JSPara.getFiledata()[fileIndex].getName()
				+ "\""
				+ lineSep);
		writeLine("Content-Type: " + JSPara.getContenttype() + lineSep
				+ lineSep);

		// Schreibt den Dateieninhalt in die Request
		writeFileContent();

		writeLine(lineSep);
		writeLine(twoStrings + boundary + lineSep);
		writeLine("Content-Disposition: form-data; name=\"majorVersion\""
				+ lineSep + lineSep);
		writeLine(JSPara.getMajorversion() + lineSep);
		writeLine(twoStrings + boundary + lineSep);
		writeLine("Content-Disposition: form-data; name=\"description\""
				+ lineSep + lineSep);
		writeLine(JSPara.getDescription() + lineSep);
		writeLine(twoStrings + boundary + twoStrings);

		// Stream beenden.
		fileInputStream.close();
		dos.flush();
		dos.close();

	}

	@SuppressWarnings("unchecked")
	public void writeFileContent() throws IOException,
			PrivilegedActionException {
		// Stream zu Auslesen der Daten.
		fileInputStream = (FileInputStream) AccessController
				.doPrivileged(new PrivilegedExceptionAction() {
					public Object run() throws FileNotFoundException {
						return new FileInputStream(
								JSPara.getFiledata()[fileIndex]);
					}
				});

		// Startet den Stream zum lesen der Datei.
		AccessController.doPrivileged(new PrivilegedExceptionAction() {
			public Object run() throws FileNotFoundException {
				try {
					streamCopy();
				} catch (IOException e) {
					e.printStackTrace();
				}
				return null;
			}
		});
	}

	public void streamCopy() throws IOException {

		int begin = 0;
		int current = begin;
		int end = 0;

		if((int) JSPara.getFiledata()[fileIndex].length() > DEFAULT_BUFFER_SIZE){
			end = (int) JSPara.getFiledata()[fileIndex].length()
				/ DEFAULT_BUFFER_SIZE;
		}else{
			end = 1;
			setValue(current++);
		}

		setMinMax(begin, end);

		byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];

		int n = 0;
		try {
			while (-1 != (n = fileInputStream.read(buffer))) {
				try {
					dos.write(buffer, 0, n);

					setValue(current++);
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private void setMinMax(final int min, final int max) {
		try {
			SwingUtilities.invokeAndWait(new Runnable() {
				public void run() {
					pb.setMinimum(min);
					pb.setValue(min);
					pb.setMaximum(max);
				}
			});
		} catch (Exception e) {
		}
	}

	private void setValue(final int value) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				try {
					pb.setValue(value);
				} catch (NullPointerException ex) {
					// silent exception
				}
			}
		});
	}

	private void writeLine(String text) throws IOException {
		System.out.print(text);
		dos.writeBytes(text);
	}
}
```

ich hab nun auch schon versucht den dataoutputstream mittels der writeUTF-Funktion zu schreiben, aber es erscheint der selbe fehlercode 400.

Gruß


----------



## homer65 (13. Aug 2010)

Statt:

```
dos.writeBytes(text);
```
könnte ich mir folgendes vorstellen:

```
byte[] b = text.getBytes("iso-8859-1");
 dos.write(b,0,b.length);
```
Wobei iso-8859-1 durch den richtigen Charset Namen zu ersetzen ist.
Was hier allerdings der richtige ist, weiss ich auch nicht.


----------



## Sued_Faust (13. Aug 2010)

Ok ich werd an dieser Stelle auf jedenfall mal ansetzen und Testen.
Aber wie sieht es denn an er Stelle aus an der die Datei in die Request mit reingeschrieben wird?

```
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
 
        int n = 0;
        try {
            while (-1 != (n = fileInputStream.read(buffer))) {
                try {
                    dos.write(buffer, 0, n);
 
                    setValue(current++);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
```
Muss die auch in einen andern Charset gewandelt werden?


----------



## homer65 (13. Aug 2010)

Was ist das denn für eine Datei? Stehen da lesbare Zeichen drin?
Um mal zu raten: Da wird vermutlich keine Zeichenumsetzung nötig sein. Ist aber wie gesagt nur geraten.


----------



## Sued_Faust (13. Aug 2010)

Es lag wohl nicht an der Codierung der zeichen, sondern an meinem LineSeperator?!
Wenn ich wie unter linux \n\r nutze anstelle System.getProperty("line.seperator") funktioniert es.
Aber wie kann das sein? Ich dachte immer System.getPr...
holt sich den Seperator des OS!?


----------



## homer65 (13. Aug 2010)

Ja aber es sind zwei OS im Spiel.
Das wo das Applet läuft und das des Servers. Wenn die unterschiedlich sind.


----------



## Sued_Faust (13. Aug 2010)

Hmmm ja sie sind unterschiedlich. Also kann ich die Methode System.getProp... so nicht nutzen?
Wie kann ich es sonst am besten anstellen um das am besten mit einer Funktion zu erschlagen?


----------



## Sued_Faust (13. Aug 2010)

Na gut habs nun erst mal mit einer Abfrage nach dem Betriebssystem glöst, vieleicht find ich ja noch irgendwann eine bessere Lösung.

Danke dir für die Hilfe!


----------



## maki (13. Aug 2010)

Dein Denkfehler hat homer65 ja schon erklärt: Du verwechselst den Server mit dem Client 

Wichtig ist nicht das OS des Client, sondern nur das des Servers, soll heissen: Dein Server ist 'ne Windows Kiste und braucht immer  \n\r, ausser der Server läuft irgendwann mal später auf Linux.

Wenn du fertige Frameworks genutzt hättest wie zB. Apache HttpClient, hättest du das Problem doch gar nciht.

IMHO sollte aber \n\r immer funktionieren.


----------

