Sé que siempre has pensado en las pruebas y tribulaciones de experimentar las alegrías de la vida como un proxy web. Honestamente, ¿quién no? Hoy tienes la tarea de alcanzar este objetivo (al menos una parte de él). El sitio web X recibe mucho tráfico a diario y está buscando un PaaS (claramente esto se refiere a Proxy as a Service) debido a la gran cantidad de usuarios que insisten en pasar información confidencial a través de parámetros de consulta (los usuarios son tontos). Su tarea es eliminar todos los parámetros de consulta confidenciales de la solicitud antes de reenviar la solicitud a su destino original.
Entrada
- Una URL HTTP absoluta bien formada que sigue la gramática de URI en RFC3986 Sección 3 .
- Puedes asumir que no hay fragmento
- Breve ejemplo de formato donde cualquier cosa entre corchetes denota opcional:
http[s]://[user:pass@]host.name.com[:port]/[?param1=value1¶m2=value2...]
- Una lista de parámetros de consulta que se eliminarán.
Salida
La URL HTTP modificada sin los parámetros definidos en la lista de entrada.
Ejemplos
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
Puntuación
Este es el código de golf , por lo que gana la respuesta más corta (en bytes).
&
aparecer en cualquier otro lugar que no sea entre parámetros??
? ¿También debe mantenerse la orden como estaba?&
es parte de un parámetro de consulta, debe estar correctamente codificado como%26
http://foo:&[email protected]:8080/?foo=1&bar=foo
está permitido por el RFC. Esto debería romper muchas de las soluciones existentes. : D (La regla es userinfo puede expandirse como sin reservas o pct-escape o subdelimitaciones, y los subdelimitaciones pueden tener&
y=
)Respuestas:
GNU sed
98 96 88 80 77 74 69 59 54(48 + 1 para -r) 49La lista de parámetros para eliminar están separados por espacios.
fuente
&
o un?
carácter en la URL resultante.JavaScript (ES6),
6260 bytesEditar: Guardado 2 bytes gracias a @Shaggy.
fuente
.href
al final.alert
lo usa o lo inserta en un nodo (texto), como lo ha hecho, le dará lahref
propiedad del objeto. Sin embargo, si lo registras en la consola, te dará el objeto completo. Ver este violín .PHP, 90 bytes
-11 Bytes si? o & está permitido al final
Versión anterior 140 bytes
fuente
^
/(.*|$)
serán parte de la primera / última alternativa..*
. o reemplazar(=.*|$)
con\b
(-5).#^foo|bar(=.*|$)#
que es idéntica a#(^foo)|(bar=.*|bar$))#
. Pero debería ser#(foo|bar)(=.*|$)#
.array_map
(y me sorprendió lo corto que puede resultar).PHP,
120110 bytescon funciones preg_replace y array: (inspirado en Jörg )
guardar en archivo, llamar con
php <scriptname> <uri> <parametername> <parametername> ...
con parse_str y http_build_query (120 bytes):
corre con
php -r <code> <uri> <parametername> <parametername> ...
fuente
parse_str
?http_build_query
? Estoy muy contento de ver a alguien trabajando con las herramientas adecuadas para el trabajo, incluso en el código de golf. Los errores que surgen debido a que URL / SQL query / regexp / HTML son "solo cadenas" son tan numerosos como fáciles de prevenir.Java 7, 127 bytes
Explicación
Ideona
fuente
C #,
377336330328 bytes (173 alt)Programa completo sin golf:
Probablemente no sea muy eficiente, pero creo que funciona.
Alternativamente, hay una solución de 173 bytes que utiliza el método @ Poke de Java. Sin embargo, requiere una importación para Regex, por lo que probablemente no pueda ser más corto.
fuente
Ruby,
146 140 127 119 116113 bytesedición 2: guardado 6 bytes usando
$1
,$2
y$*
, y 7 cambiandox.split("=")[0]
ax[/\w+/]
edición 3: guardado 6 bytes usando en
*
lugar de.join
, guardado 2 bytes de espacios innecesariosedición 4: guardado 3 bytes reformulando en línea (cambió la expresión regular a equivalente
$*[1][/([^?]*)\??(.*)/,1]
y puso según lo asignadoa
)editar 5: guardado 3 bytes usando en
($*[2].scan(r=/\w+/)&[x[r]])[0]
lugar de$*[2].scan(r=/\w+/).include?(x[r])
Asumiendo la entrada al programa cuando lo ejecuta:
Explicación
Esto analiza la URL dada en la línea de comando y almacena las coincidencias en
$1
y$2
.$*[1][/([^?]*)\??(.*)/,1]
también devuelve la primera coincidencia para almacenar en el interiora
, mientras que la segunda coincidencia se conoce como$2
dejar un punto a $ 1 y analizarb
en una matriz de matrices ...... rechazando todo eso ...
... tiene una cadena antes del '=' que se incluye en la lista de nombres dados por el segundo parámetro ... Esto funciona porque buscamos palabras (para obtener la lista) y luego la palabra antes del
=
, y vemos si esa palabra está en la lista con&
. Dado que&
devuelve una matriz vacía en "no encontrado" (el conjunto nulo), usamos el truco explicado a continuación para obtenernil
si no hay elementos en la matriz. de lo contrario, devolvemos una cadena, que cuenta como verdadera, que rechaza esa cadena.... y une las cadenas restantes junto con '&'
En este punto,
b
es la cadena de consulta GET para la URL. Por lo tanto, solo necesitamos imprimirlo.Esto usa un truco en rubí.
b[0]
seránil
si b es una matriz o cadena vacía. Entonces, si es verdad , (nonil
ofalse
), entonces hay al menos un elemento en la matriz, por lo que necesitamos ponera+"?"+b
la URL correcta. de lo contrario, solo ponemosa
, porque no hay parámetros para mostrarNota: esta respuesta asume que
?
no puede aparecer en ninguna parte excepto para delimitar la URL de la consulta. (según lo que leí del RFC vinculado)Además, esta es mi primera respuesta de golf: D
fuente
Pip , 46 bytes
Toma la URL de stdin y los parámetros de consulta para eliminarlos de los argumentos de la línea de comandos.
Pruébalo en línea!
Explicación:
fuente
PowerShell v3 +,
11590 bytesToma la entrada
$n
como la URL y$z
como una matriz literal de cadenas como los parámetros a eliminar.-split
En la URL de entrada?
, almacena la primera mitad$a
y la segunda en$b
.A continuación,
$b
se reformula haciendo un ciclo$z
, realizando una expresión regular-replace
en cada palabra de consulta prohibida para eliminarlas. Luego, las salidas$a
(sin modificar), más un/
dependiendo de si$b
existe, más un?
dependiendo de si$x
existe, más `$ x.fuente
Pyth - 27 bytes
Kenny estaba en lo cierto cuando habló sobre el proceso de transformación y luego inversión, sin embargo, será muy difícil corregirlo.
Test Suite .
fuente
Retina ,
4448 bytesTachado 44 sigue siendo 44. Gracias a Martin por la solución.
Toma entrada como
uri param1 param2
. Pruébalo en línea!Explicación
El primer reemplazo elimina los parámetros apropiados de la cadena de consulta.
[?&](?>([^ =&+))[^ &]*
coincide con un?
o&
, un nombre de parámetro completo, y (opcionalmente)=
y un valor, almacenando el nombre del parámetro en el grupo de captura 1. Luego(?=.* \1( |$))
hay una búsqueda anticipada que verifica si ese nombre de parámetro aparece en la lista de parámetros para eliminar. Si un parámetro coincide con estas condiciones, se elimina (sustituye con un reemplazo vacío).Las sustituciones no se superponen (gracias a la búsqueda anticipada) y proceden de izquierda a derecha. Al llegar al final de la URL, la
.*
rama coincide con la lista de parámetros para eliminar y también la elimina.El segundo reemplazo solo se asegura de que la nueva cadena de consulta comience
?
si se eliminó el primer parámetro.fuente
(?>...)
.Java 7, 203 bytes
Sin golf:
Esta función pasa todas las pruebas.
fuente
Python,
7581112 bytes:Una función con nombre. Toma entrada en el formato
y genera una cadena.
Repl.it con todos los casos de prueba!
fuente
PHP, no compitiendo
Diablos, PHP fue hecho para esto; ¿Por qué no usar la URL real?
Guardar en el archivo, llamar con la cadena de consulta deseada más
&x[]=x&x[]=<exclude1>&x[]=<exclude2>&...
.Puede fallar el nombre de usuario y la contraseña (dependiendo de si su navegador los elimina o no).
Se producirá un error si la contraseña es
0
.fuente