Ich weiß, Sie haben immer über die Strapazen nachgedacht, die es mit sich bringt, als Web-Proxy die Freuden des Lebens zu erleben. Ehrlich gesagt, wer hat das nicht? Heute haben Sie die Aufgabe, dieses Ziel zu erreichen (zumindest einen Teil davon). Website X erhält täglich viel Verkehr und sucht aufgrund der großen Anzahl von Benutzern, die darauf bestehen, vertrauliche Informationen über Abfrageparameter weiterzugeben (Benutzer sind albern), nach einem PaaS (dies bezieht sich eindeutig auf Proxy als Dienst). Ihre Aufgabe ist es, alle vertraulichen Abfrageparameter aus der Anforderung zu entfernen, bevor Sie die Anforderung an das ursprüngliche Ziel weiterleiten.
Eingang
- Eine wohlgeformte absolute HTTP-URL, die der URI-Grammatik in RFC3986, Abschnitt 3 , folgt .
- Sie können davon ausgehen, dass es kein Fragment gibt
- Kurzes Formatbeispiel, in dem alles in eckigen Klammern als optional gekennzeichnet ist:
http[s]://[user:pass@]host.name.com[:port]/[?param1=value1¶m2=value2...]
- Eine Liste der zu entfernenden Abfrageparameter.
Ausgabe
Die geänderte HTTP-URL ohne die in der Eingabeliste definierten Parameter.
Beispiele
http://example.com/ [foo]
> http://example.com/
http://example.com/?foo=bar []
> http://example.com/?foo=bar
http://example.com/ []
> http://example.com/
http://example.com/?foo=1&bar=2&baz=3 [foo,baz]
> http://example.com/?bar=2
http://example.com/?foo=1&bar=2&baz=3 [foo,bar,baz]
> http://example.com/
http://example.com/?foo&bar=2&baz= [foo,baz]
> http://example.com/?bar=2
http://example.com/?abc=1&def=2&baz=foo [foo,bar]
> http://example.com/?abc=1&def=2&baz=foo
http://example.com/?foobar=baz [foo]
> http://example.com/?foobar=baz
http://foo:[email protected]:8080/?foo=1&bar=foo [foo]
> http://foo:[email protected]:8080/?bar=foo
Wertung
Das ist Code-Golf , also gewinnt die kürzeste Antwort (in Bytes).
&
irgendwo anders als zwischen Parametern erscheinen??
? Sollte die Bestellung auch so bleiben, wie sie war?&
es Teil eines Abfrageparameters ist, sollte er korrekt urlencodiert sein als%26
http://foo:&[email protected]:8080/?foo=1&bar=foo
ist das nach dem RFC erlaubt. Dies sollte einen Haufen bestehender Lösungen zerstören. : D (Die Regel ist, dass Benutzerinformationen als nicht reserviert oder pct-Escape oder Sub-Delims erweitert werden können und Sub-Delims haben können&
und=
)Antworten:
GNU sed
98 96 88 80 77 74 69 59 54(48 + 1 für -r) 49Die Liste der zu entfernenden Parameter wird durch Leerzeichen getrennt.
quelle
&
oder ein?
Zeichen in der resultierenden URL an.JavaScript (ES6),
62 -60 ByteBearbeiten: 2 Bytes dank @Shaggy gespeichert.
quelle
.href
am Ende löschen .alert
es beispielsweise verwenden oder in einen (Text-) Knoten einfügen, erhalten Sie diehref
Eigenschaft des Objekts. Wenn Sie es jedoch in der Konsole protokollieren, erhalten Sie das vollständige Objekt. Sehen Sie diese Geige .PHP, 90 Bytes
-11 Bytes wenn? oder & ist am Ende erlaubt
Vorherige Version 140 Bytes
quelle
^
/(.*|$)
wird Teil der ersten / letzten Alternative..*
. oder ersetzt(=.*|$)
mit\b
(-5).#^foo|bar(=.*|$)#
, als wäre er identisch mit#(^foo)|(bar=.*|bar$))#
. Aber es sollte so sein#(foo|bar)(=.*|$)#
.array_map
(und ich war überrascht, wie kurz es werden kann).PHP,
120 bis110 Bytesmit preg_replace und array Funktionen: (inspiriert von Jörg )
In Datei speichern, mit anrufen
php <scriptname> <uri> <parametername> <parametername> ...
mit parse_str und http_build_query (120 Bytes):
renn mit
php -r <code> <uri> <parametername> <parametername> ...
quelle
parse_str
?http_build_query
? Ich bin so froh, jemanden zu sehen, der mit den richtigen Werkzeugen für den Job arbeitet, sogar im Code-Golf. Fehler, die auftreten, weil URL / SQL-Abfrage / Regexp / HTML "nur Zeichenfolgen" sind, sind so zahlreich wie sie leicht vermeidbar sind.Java 7, 127 Bytes
Erläuterung
Ideone
quelle
C #,
377336330328 bytes (173 alt)Ungolfed volles Programm:
Wahrscheinlich nicht sehr effizient, aber es funktioniert, denke ich.
Alternativ gibt es eine 173-Byte-Lösung mit der @ Poke-Methode von Java. Erfordert jedoch einen Import für Regex, kann also wahrscheinlich nicht kürzer sein.
quelle
Ruby,
146 140 127 119 116113 Bytesedit 2: speichere 6 Bytes mit
$1
,$2
und$*
und 7 durch Ändernx.split("=")[0]
inx[/\w+/]
edit 3: speichere 6 Bytes mit
*
statt mit.join
, speichere 2 Bytes aus unnötigen Leerzeichenedit 4: speichere 3 Bytes durch Neuformulieren von Inline (Regex geändert in Äquivalent
$*[1][/([^?]*)\??(.*)/,1]
und Put wie zugewiesena
)edit 5: speichere 3 Bytes mit
($*[2].scan(r=/\w+/)&[x[r]])[0]
anstelle von$*[2].scan(r=/\w+/).include?(x[r])
Angenommen, Sie geben beim Ausführen des Programms Folgendes ein:
Erläuterung
Dadurch wird die in der Befehlszeile angegebene URL analysiert und die Übereinstimmungen in
$1
und gespeichert$2
.$*[1][/([^?]*)\??(.*)/,1]
gibt auch die erste Übereinstimmung zurück, die gespeichert werden solla
, während die zweite Übereinstimmung als$2
let a point to $ 1 bezeichnet wird undb
in ein Array von Arrays zerlegt wird ...... das alles ablehnen ...
... einen String vor dem '=' haben, der in der Liste der durch den zweiten Parameter angegebenen Namen enthalten ist ... Dies funktioniert, weil wir nach Wörtern suchen (um die Liste zu erhalten) und dann das Wort vor dem
=
abrufen und nachsehen, ob Dieses Wort ist in der Liste mit&
. Da&
bei "not found" (der Nullmenge) ein leeres Array zurückgegeben wird, verwenden wir den unten erläuterten Trick, um zu ermitteln,nil
ob das Array keine Elemente enthält. Andernfalls geben wir eine Zeichenfolge zurück, die als wahr gilt und die diese Zeichenfolge ablehnt.... und verbinde die restlichen Strings mit '&'
An dieser Stelle
b
befindet sich die GET-Abfragezeichenfolge für die URL. Daher müssen wir es nur drucken.Dies verwendet einen Trick in Rubin.
b[0]
wird sein,nil
wenn b ein leeres Array oder eine leere Zeichenfolge ist. Also, wenn es wahr ist , (nichtnil
oderfalse
), dann gibt es mindestens ein Element im Array, also müssen wira+"?"+b
für die richtige URL setzen. Ansonsten setzen wir einfacha
, weil es keine Parameter gibt, die angezeigt werden könntenHinweis: Bei dieser Antwort wird davon ausgegangen, dass
?
sie nur zur Begrenzung der URL in der Abfrage angezeigt wird. (Nach dem, was ich aus dem verlinkten RFC gelesen habe)Auch dies ist meine erste Golfantwort: D
quelle
Pip , 46 Bytes
Übernimmt die URL von stdin und die Abfrageparameter zum Entfernen aus Befehlszeilenargumenten.
Probieren Sie es online!
Erläuterung:
quelle
PowerShell v3 +,
115 bis90 ByteNimmt Eingaben
$n
als URL und$z
als literales Array von Zeichenfolgen als zu entfernende Parameter.-split
Ist die Eingabe-URL aktiviert?
, werden die erste Hälfte in$a
und die zweite in gespeichert$b
.Als nächstes
$b
wird$z
eine neue Formulierung erstellt , indem-replace
für jedes gesperrte Abfragewort eine Schleife durchlaufen wird , um sie zu entfernen. Dann werden Ausgaben$a
(unverändert) plus a in/
Abhängigkeit davon, ob$b
vorhanden, plus a in?
Abhängigkeit davon, ob$x
vorhanden, plus `$ x ausgegeben.quelle
Pyth - 27 Bytes
Kenny hatte Recht, als er über das eingebaute Umwandeln und anschließende Invertieren sprach. Es wird jedoch sehr schwierig sein, dies zu korrigieren.
Test Suite .
quelle
Retina ,
4448 BytesDie durchgestrichene 44 ist immer noch 44. Vielen Dank an Martin für die Korrektur.
Nimmt Eingaben wie
uri param1 param2
. Probieren Sie es online!Erläuterung
Die erste Ersetzung löscht die entsprechenden Parameter aus der Abfragezeichenfolge.
[?&](?>([^ =&+))[^ &]*
Entspricht einem?
oder&
, einem vollständigen Parameternamen und (optional)=
einem Wert, der den Parameternamen in Erfassungsgruppe 1 speichert. Anschließend(?=.* \1( |$))
wird in einem Lookahead überprüft, ob dieser Parametername in der Liste der zu löschenden Parameter enthalten ist. Wenn ein Parameter diesen Bedingungen entspricht, wird er entfernt (durch eine leere Ersetzung ersetzt).Die Ersetzungen überlappen sich nicht (dank des Lookaheads) und werden von links nach rechts fortgesetzt. Am Ende der URL
.*
stimmt der Zweig mit der Liste der zu löschenden Parameter überein und entfernt sie ebenfalls.Die zweite Ersetzung stellt nur sicher, dass die neue Abfragezeichenfolge mit beginnt,
?
wenn der erste Parameter gelöscht wurde.quelle
(?>...)
.Java 7, 203 Bytes
Ungolfed:
Diese Funktion besteht alle Tests.
quelle
Python,
7581112 Bytes:Eine benannte Funktion. Übernimmt Eingaben im Format
und gibt einen String aus.
Repl.it Mit allen Testfällen!
quelle
PHP, nicht im Wettbewerb
Heck, PHP wurde dafür gemacht; Warum nicht die aktuelle URL verwenden?
In Datei speichern, mit der gewünschten Abfragezeichenfolge plus aufrufen
&x[]=x&x[]=<exclude1>&x[]=<exclude2>&...
.Kann bei Benutzernamen und Passwort fehlschlagen (abhängig davon, ob Ihr Browser sie entfernt oder nicht).
Wird fehlschlagen, wenn das Passwort ist
0
.quelle