URL-Parameter komprimieren?

15/11/2008 - 10:35 von Ulli Horlacher | Report spam
Ich hab eine Anwendung wo via HTTP GET laengere Parameter in der URL
uebergeben werden (*), Beispielsweise:

http://server/cgi?parameter1=hier_s..._viel_mehr

Diese Parameter wuerd ich gern komprimieren, zB auf so was:

http://server/cgi.pl?ph^_e$.Y9(:%uh!,Ee#Fi2\m+*e~gh

Dabei muss das cgi.pl aus der komprimierten Form wieder die
Original-Parameter herstellen koennen, also eine Einweg-hash-Funktion wie
md5 kommt nicht in Frage.

Standard-Kompressionsverfahren wie gzip sind erst mit groesseren
Datenmengen richtig effizient. Ausserdem erzeugen sie Binaerdaten, die man
in einer URL nicht unkodiert verwenden kann, was dann aber genau den
gegenteiligen Effekt hat: Komprimierung und base64-Kodierung fuehrt eher
zu mehr Bytes als weniger.

Welches Kompressionsverfahren wuerde sich hier anbieten?


(*) HTTP POST kommt aus diversen Gruenden nicht in Frage.

Ullrich Horlacher Informationssysteme und Serverbetrieb
Rechenzentrum E-Mail: horlacher@rus.uni-stuttgart.de
Universitaet Stuttgart Tel: ++49-711-685-65868
Allmandring 30 Fax: ++49-711-682357
70550 Stuttgart (Germany) WWW: http://www.rus.uni-stuttgart.de/
 

Lesen sie die antworten

#1 Peter J. Holzer
15/11/2008 - 22:14 | Warnen spam
On 2008-11-15 09:35, Ulli Horlacher wrote:
Ich hab eine Anwendung wo via HTTP GET laengere Parameter in der URL
uebergeben werden (*), Beispielsweise:



Ich auch. Wobei das 8kB Limit vom Apache nur selten ein Problem
darstellt, mit den 32 kB von lighttpd sollte ich eigentlich auskommen.
Darum habe ich mir bisher keine großartigen Gedanken darüber gemacht.


http://server/cgi?parameter1=hier_s..._viel_mehr

Diese Parameter wuerd ich gern komprimieren, zB auf so was:

http://server/cgi.pl?ph^_e$.Y9(:%uh!,Ee#Fi2\m+*e~gh

Dabei muss das cgi.pl aus der komprimierten Form wieder die
Original-Parameter herstellen koennen, also eine Einweg-hash-Funktion wie
md5 kommt nicht in Frage.

Standard-Kompressionsverfahren wie gzip sind erst mit groesseren
Datenmengen richtig effizient. Ausserdem erzeugen sie Binaerdaten, die man
in einer URL nicht unkodiert verwenden kann, was dann aber genau den
gegenteiligen Effekt hat: Komprimierung und base64-Kodierung fuehrt eher
zu mehr Bytes als weniger.

Welches Kompressionsverfahren wuerde sich hier anbieten?



Ich würde folgendes machen:

1) bestimme die Menge der Zeichen, die Du verwenden kannst. Wenn Du sehr
vorsichtig bist hàltst Du Dich an RFC 1738 (only alphanumerics, the
special characters "$-_.+!*'()," ... may be used unencoded - gibt 73
Zeichen), in der Praxis gehen wahrscheinlich ein paar Zeichen mehr.

2) Dann legst Du eine geeignete Wortlànge fest. Bei 2 Bytes hast Du
73*73 = 5329 mögliche Kodierungen.

4) Schließlich nimmst Du einen Haufen Parameterstrings, die Du kodieren
möchtest, extrahierst sàmtliche möglichen Substrings (vielleicht bis
zu einer maximalen Lànge) und wàhlst die hàufigsten 5329. Jedem
dieser Substrings weist Du dann eines der in Schritt 2 definierten
Zeichenpaare zu.

5) Beim Kodieren suchst Du jeweils nach dem làngsten Teilstring, der
sich durch ein solches Zeichenpaar ersetzen làsst.

6) Beim Dekodieren ersetzt Du jeweils ein Paar durch den entsprechenden
String.

Ob das URLs wirklich sehr viel kürzer macht, weiß ich nicht, aber über
den Daumen gepeilt könnte eine Kompressionsrate von ca. 1:2
herauskommen. Wenn Du Pech hast, können die URLs aber auch auf maximal
das Doppelte aufgeblasen werden.

Sollte ich vielleicht auch ausprobieren. Aber ich fürchte, der Kollege,
der den Client schreibt, wird mich erschlagen, wenn ich ihm das
vorschlage ;-).

hp

Ähnliche fragen