Über dieses Blog...
Tipps und Tricks, aber auch Kritik - breit gefächert von Technik bis hin zum Design, manchmal (oder immer öfter) auch Politik.
Momentaner Fokus: Android/Java, CalDAV, Windows 7 benutzbar machen
Feeds
Interessant gefunden? Mitlesen? Vollständige Beiträge per Feed.
Zur Weiterverarbeitung oder zum Einbauen für Ihre Homepage: CSV, JavaScript
Tag-Cloud
Durchsuchen
Kategorien
Archiv
| Mo | Di | Mi | Do | Fr | Sa | So |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 |
Java: HTTP und WebDAV
Von e7 am 11.08.2010, 15:39 in der Kategorie Kopfschüttelnd... mit den Tags http webdav java. Kompletten Eintrag zeigen
Eine Java HttpURLConnection kann kein PROPFIND absetzen — warum? Deshalb:
// This restriction will prevent people from using this class to
// experiment w/ new HTTP methods using java. But it should
// be placed for security — the request String could be
// arbitrarily long.
Steht so im Quellcode der Standardbibliothek. Bitte macht nix böses mit Java! Mal schauen, ob man das ohne weiteres umgehen kann oder ob man gleich den HTTP-Handler komplett selbst schreiben muss. Wie auch immer: Doofes Java.
[UPDATE]
Ich hab jetzt in der Datei java/net/HttpURLConnection.java die Zeilen 327 bis 334 auskommentiert, die für die Prüfung/Exception verantwortlich sind. Anschließend benötigt man noch ein this.method = method; um die Sache auch zu speichern. Alternativ könnte man auch method einfach public machen und ohne die Hilfe einer Funktion die Methode setzen.
Das ganze kann man anschließend durch den Compiler jagen:
javac HttpURLConnection.java
In bspw. C:\Programme\Java\[jdk+version|jre]\jre\lib oder wo auch sonst sich das Zeug überall breitmacht findet man eine rt.jar. Da kann man die Datei recht einfach ersetzen. Dummerweise funktioniert das zwar, er meckert dann aber irgendwas von wegen „REPORT doesn't support output stream“. Irgendwo muss also noch mehr versteckt sein — ich weiß nur noch nicht, wo. Ich glaube, HTTP selbst zu implementieren wäre da fast einfacher, zumindest solange kein SSL dazu kommt.
Android/Java: HTTP-Requests absenden
Von e7 am 06.08.2010, 17:40 in der Kategorie Code-Snippets mit den Tags netzwerk verbindung https http internet android. Kompletten Eintrag zeigen
Zumindest per HTTP klappt das Nachfragen — HttpsURLConnection klappt leider nicht (import javax.net.ssl.HttpsURLConnection) und wirft eine nichtssagende Fehlermeldung mit irgendeiner Klassenangabe von Apache Harmony. Die Zeilen, die mit java.io.* zu tun haben (insbesondere das Anlegen des BufferedReader) lassen mich erahnen, warum so eine richtige objektorientierung wohl doch nicht immer ideal ist…
Hier wieder der Code (über die Formatierung hier im Blog muss ich auch mal drüber schauen — ist aber ne geklaute Klasse, d. h. die kann ich nicht ohne weiteres Einarbeiten anpassen):
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.*;
public class TestActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
String s = „DEBUG:\n";
try {
String t;
String postData = „Testtext per POST";
// Verbindung aufbauen, Parameter setzen
URL u = new URL(„http://192.168.2.100/reverse.php“);
//HttpsURLConnection uc = (HttpsURLConnection)u.openConnection();
HttpURLConnection uc = (HttpURLConnection)u.openConnection();
uc.setUseCaches(false);
uc.setDoInput(true);
uc.setDoOutput(true);
// POST-Data setzen
uc.setRequestMethod(„POST“);
uc.setRequestProperty(„Content-Type", „text/xml; charset=utf-8“);
uc.setRequestProperty(„Content-Length", Integer.toString(postData.getBytes().length));
DataOutputStream dos = new DataOutputStream(uc.getOutputStream());
dos.writeBytes(postData);
dos.flush();
dos.close();
// Rückgabe lesen
BufferedReader br = new BufferedReader(new InputStreamReader(uc.getInputStream()));
while ((t = br.readLine()) != null) {
s += t + „\n";
}
br.close();
// Done :)
uc.disconnect();
} catch (Exception e) {
s = „ERR: „+e.getMessage();
}
tv.setText(s);
setContentView(tv);
}
}
Die reverse.php ist übrigens einfach nur ein PHP-Script, das die per POST reinkommenden Daten umdreht und wieder ausgibt:
<?
$post = file_get_contents(„php://input“);
echo strrev($post);
?>
Das Schimpfen auf falsch interpretierte Standards...
Von e7 am 05.02.2009, 12:00 in der Kategorie Kopfschüttelnd... mit den Tags bug standard rfc header html http bashing firefox mozilla gecko. Kompletten Eintrag zeigen
Was ist der Unterschied zwischen den folgenden beiden Zeilen?
header(„Content-Disposition: attachment; filename=\"blubb\"“);header(„Content-Disposition: filename=\"blubb\"; attachment“);
Ganz einfach: die erste Zeile funktioniert, die zweite nicht. Und jetzt die große Preisfrage: Warum ist das so? Eigentlich ist diese Frage noch viel leichter zu beantworten: Es ist so definiert. RFC 2183 gibt nähere Auskunft:
disposition := „Content-Disposition“ „:“
disposition-type
*(„;“ disposition-parm)
Daraus wird eigentlich relativ klar ersichtlich, dass disposition-type (also inline oder attachment) zuerst steht und anschließend die optionalen Parameter auftauchen — was ja soweit auch logisch und nachvollziehbar ist.
Nächste Preisfrage: Wo stehen diese Angaben? Auch ganz einfach: im HTTP-Header.
Nun ist mir allerdings eben die tolle Seite vb-fun.de über den Weg gelaufen. Das Design ähnelt (vor allem in den drei Farbrechtecken oben links) einer berühmten Frontpage-Vorlage und lässt auch dadurch eine gewisse Microsoft-Verbundenheit vermuten. Nun les ich allerdings in deren Downloadhinweisen folgendes:
Bei einigen Software-Firewalls (Norton) und Browsern (z.B. Opera, Mozilla) ist die Übergabe des HTTP-Referrers standardmäßig abgeschaltet.
Ich wüsste nicht, dass mein Mozilla seine HTTP-Requests standardmäßig ohne Referrer bildet. Es gibt Extensions, die das möglich machen, aber default — nein. Soweit allerdings nicht so schlimm — was man nicht einsetzt, kennt man nicht so gut. Vielmehr ist mir das Gecko-Bashing aufgefallen:
Dies passiert, wenn Sie Browser wie den Mozilla oder Firefox einsetzen. Leider ignorieren diese von Ihrer Fangemeinde so hochgelobten Browser beharrlich den HTML-Standard.Nach diesem Standard gibt es sogenannte HTML-Header. Unser Script versendet gemäß dieses Headers ein Zip-Archiv. Leider sehen die vorgenannten Browser das allerdings etwas anders. Benennen Sie die erhaltene Datei einfach in die von Ihnen angeforderte *zip-Datei um. Beispiel (Datei „Tip.pl“ erhalten, umbenennen in z.B. „tip0210.zip“)
Und jetzt zum Vergleich das, was das Script wirklich sendet:
HTTP/1.1 200 OK
Date: Thu, 05 Feb 2009 10:34:31 GMT
Server: Apache/1.3.37 (Unix)
Content-Disposition: filename="Wellen.zip"; attachment
Content-Length: 55877;
Keep-Alive: timeout=3, max=100
Connection: Keep-Alive
Content-Type: application/octet-stream;PK(und-jetzt-ca-55875-Bytes)
Wenn wir uns jetzt an unser allgemeines Grundwissen sowie meine vorher aufgeführten Punkte erinnern, könnte es einem dämmern, warum Firefox den HTML-Standard ignoriert.
Erstens: Die Informationen über die Datei befinden sich im HTTP-Header und nicht im HTML-Header. Also kann folglich eigentlich kein Browser die Angaben nach HTML-Standard befolgen — zusätzlich ist das ganze ja eigentlich eine ZIP-Datei.
Zweitens: application/octet-stream ist zwar alles, aber kein ZIP. Funktioniert unter Windows zwar genauso, widerspricht allerdings der Aussage „Unser Script versendet gemäß dieses Headers ein Zip-Archiv.“
Drittens: Wären wir bei der Reihenfolge der Angaben in Content-Disposition. Nachdem hier disposition-type mit filename=irgendwas angegeben ist, kennt das natürlich kein korrekter Browser.
Jetzt ist noch die Frage, warum es im Internet Explorer klappt. Sicher nicht, weil er irgendwelche Standards beachtet. Wohl eher, weil der Internet Explorer alles versucht zu interpretieren…
Mal schauen, wie die von vb-fun.de reagieren. Entweder das Problem löst sich wie von selbst, oder es wird fröhlich weitergebasht. Die Zeit läuft :)
Edit, 13.10 Uhr: Das Problem scheint behoben zu sein, zumindest wird mir jetzt in SeaMonkey der richtige Dateiname angezeigt. Der Satz auf der Website hat sich verkürzt in: Dies kann passieren, wenn Sie Browser wie den Mozilla oder Firefox einsetzen. Das ging ja richtig schnell, wenn auch noch das Stichwort Firefox enthalten ist…
Alle Nachrichten finden Sie im Archiv.
© 2001 - 2012 by e7o.de; powered by e7cms. XHTML Strict für gute Browser.