Forum: Rails-ES Microsoft Office Protocol Discovery method OPTIONS

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
0fdce938a28a604fd5613a68b0d78fcb?d=identicon&s=25 Jose vicente Ribera pellicer (joripel)
on 2009-05-05 18:44
Muy buenas, hasta hace poco el exception notifier nos mandaba correos en
lsoq eu nos informaba que el method OPTIONS no estaba permitido, el cual
personalmente no habia visto hasta entonces. Era algo similar a esto:

A ActionController::NotImplemented occurred in application#index:

 Only  requests are allowed.
 [RAILS_ROOT]/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb:389:in
`recognize_path'

-------------------------------
Environment:
-------------------------------

 * CONTENT_LENGTH         : 0
 * HTTP_CONTENT_LENGTH    : 0
 * HTTP_USER_AGENT        : Microsoft Office Protocol Discovery
 * HTTP_VERSION           : HTTP/1.1
 * REQUEST_METHOD         : OPTIONS
 * REQUEST_URI            : /static/





Tras investigar un poco vimos que era un methodo de Microsoft Office y
encontramos una direccion muy interesante en donde se comentaba como
solucionar el problema, adjunto el link por si a alguien le interesa:

http://rails.learnhub.com/lesson/2318-dealing-with...

La solucion que propone es bastante sencilla, para todas las direcciones
miro si el metodo es options y si lo es hago un status 200. Lo que hace
que ya no se genere el mail del exception notifier.

Hemos seguido al pie de la letra, los pasos que se explican en el link
anterior, encontrandole a todo el sentido, pero tras subirlo al servidor
el notifier nos esta mandando un sinfin de correos de este tipo:

A ActionController::MethodNotAllowed occurred in application#index:

 Only options requests are allowed.
 /opt/ruby-enterprise-1.8.6-20081215/lib/ruby/gems/1.8/gems/actionpack-2.1.2/lib/action_controller/routing/recognition_optimisation.rb:65:in
`recognize_path'

-------------------------------
Request:
-------------------------------

 * URL       :
http://www.rankia.com/blog/hablandodebolsa/uploade...
 * IP address:
 * Parameters: {}
-------------------------------
Environment:
-------------------------------

 * CONTENT_LENGTH      :
 * DOCUMENT_ROOT       : /var/www/vhosts/rankia.net/current/public
 * HTTP_ACCEPT         : image/gif, image/x-xbitmap, image/jpeg,
image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel,
application/vnd.ms-powerpoint, application/msword, */*
 * HTTP_ACCEPT_LANGUAGE: es

 * HTTP_REFERER        :
http://images.google.com/images?gbv=2&hl=es&q=desn...
 * PATH_INFO           :
/blog/hablandodebolsa/uploaded_images/3007824-md-769154.jpg
 * REQUEST_METHOD      : GET
 * REQUEST_URI         :
/blog/hablandodebolsa/uploaded_images/3007824-md-769154.jpg



Lo curioso es que TODOS los correo que nos estan llegando tienen como
origen una oeticion GET a algun tipo de imagen, ya sea jpg, gif, etc. Es
sin duda lo que ams nos sorprende, que falle solo con las imagenes ( y
porsupuesto teniendo encuenta que en ningun momento se diga que solo
esta permitido el method OPTIONS, de hecho lo unico que hacemos es
filtrar las rutas que se acceden con este metodo, pero obligar a que sea
el unico).

Cualquier comentario sea bien recibido, intentamos ahorrarnos unos
cuantos correos y nos esta saliendo el tiro por l culata :(....

Salu2
39086eb3d9a1437276d07c08ea0c3821?d=identicon&s=25 Guillermo (Guest)
on 2009-05-05 19:04
(Received via mailing list)
2009/5/5 Jose vicente Ribera pellicer
<ruby-forum-incoming@andreas-s.net>

> Muy buenas, hasta hace poco el exception notifier nos mandaba correos en
> lsoq eu nos informaba que el method OPTIONS no estaba permitido, el cual
> personalmente no habia visto hasta entonces. Era algo similar a esto:
>

La aproximación que usas a mi personalmente no me gusta.
En la documentación del plugin, recomiendan, si es mucha la
modificación,
usar rescue_action_in_public del applications controller.

will render public/500.html and will send the email notification. If you
want
to use different rules for the notification, you will need to implement
your
own rescue_action_in_public method. You can look at the default
implementation
in ExceptionNotifiable for an example of how to go about that.


Si vemos la implementación del ejemplo, creo que la solución es más
fácil y
limpia que la que propone el post al que citas, dandote más control y
sin
sobrecargar la aplicación con comprobaciones que se solucionan
fácilmente
con excepciones.
Con que añadas un when ActionController::NotImplemented, estaría
solucionado.

    def rescue_action_in_public(exception)
      case exception
        when *self.class.exceptions_to_treat_as_404
          render_404

        else
          render_500

          deliverer = self.class.exception_data
          data = case deliverer
            when nil then {}
            when Symbol then send(deliverer)
            when Proc then deliverer.call(self)
          end

          ExceptionNotifier.deliver_exception_notification(exception,
self,
            request, data)
      end
    end
*
*


Yo hubiese tirado por ahí. No se si será la mejor opción, pero me gusta
más
que la opción que propone el post.

--
Guillermo Álvarez

Sent from Madrid, Comunidad de Madrid
49b6123803e4f327144e991daab62f77?d=identicon&s=25 Daniel Rodriguez Troitiño (Guest)
on 2009-05-05 22:34
(Received via mailing list)
2009/5/5 Jose vicente Ribera pellicer
<ruby-forum-incoming@andreas-s.net>:
> -------------------------------
>
> miro si el metodo es options y si lo es hago un status 200. Lo que hace
> `recognize_path'
> Environment:
> http://images.google.com/images?gbv=2&hl=es&q=desn...
> sin duda lo que ams nos sorprende, que falle solo con las imagenes ( y
> Posted via http://www.ruby-forum.com/.
> _______________________________________________
> Ror-es mailing list
> Ror-es@lists.simplelogica.net
> http://lists.simplelogica.net/mailman/listinfo/ror-es
>

¿Qué tienes delante de Rails como servidor web? Lo digo porque con un
par de líneas de ModRewrite en Apache eso estaría solucionado y no
tendrías que "despertar" a Rails para algo tan nimio como enviar una
página en blanco.

PD: El ejemplo que has escogido es muy ejemplar de la fauna de internet
XP
0fdce938a28a604fd5613a68b0d78fcb?d=identicon&s=25 Jose vicente Ribera pellicer (joripel)
on 2009-05-06 09:33
>
> ¿Qué tienes delante de Rails como servidor web? Lo digo porque con un
> par de líneas de ModRewrite en Apache eso estaría solucionado y no
> tendrías que "despertar" a Rails para algo tan nimio como enviar una
> página en blanco.
>
> PD: El ejemplo que has escogido es muy ejemplar de la fauna de internet
> XP

Usamos Apache asi que mirare lo que comentas del ModRewrite.


>
>Con que añadas un when ActionController::NotImplemented, estaría
>solucionado.
>
El problema que le veo a esto es que este tipo de solucion puede
enmascararme en el futuro otro tipo de errores.


Muchas gracias, voy a buscar informacion sobre el Modrewrite (me queda
bastante por aprender de Apache) y si a una mala no consigo que funcione
estudiare la idea que propone Guillermo.

Saludos
0fdce938a28a604fd5613a68b0d78fcb?d=identicon&s=25 Jose vicente Ribera pellicer (joripel)
on 2009-05-06 10:55
>
> Lo digo porque con un par de líneas de ModRewrite en Apache eso estaría >solucionado
>

Aunque esto no sea un foro de Apache agradeceria si fuera posible y no
molesta a nadie un poco de ayuda en el tema. Por lo que he podido ver lo
primero que tengo que hacer es ver si el modulo esta activado, esto lo
hago editando el archivo http.conf y descomentando la siguiente linea:

#Load module rewrite_module

Una vez me aseguro que tengo el mod_rewrite instalado creamos un nuevo
archivo de configuracion .htaccess. Aqui es dondeiniciamos el modulo
mod_rewrite y tendria que aparecer algo como esto:

RewriteEngine On  #inicio el modulo mod_rewrite
RewriteCond %{REQUEST_METHOD} ^OPTION$ #la condicion es el metodo
OPTIONS
RewriteRule return 200                 #quiero que me de devuelva un
erro 200.


Me gustaria saber si seria algo parecido a esto, ya que tocar el Apache
me impone un poco de respeto...

Saludos
0fdce938a28a604fd5613a68b0d78fcb?d=identicon&s=25 Jose vicente Ribera pellicer (joripel)
on 2009-05-06 12:18
Finalmente y tras hablarlo con los compañeros hemos decidido optar por
la solucion que proponi Guillermo.
Ha quedado asi:

def rescue_action_in_public(exception)
      case exception
        when *self.class.exceptions_to_treat_as_404
          render_404

        ##########ESTO LO AÑADO AL PLUGIN PARA EVITAR EL METHOD OPTIONS
DEL OFFICE-->si no implementa un method  saco un 200###########
        when ActionController::NotImplemented
          render_200
        #####################################################################################################################
        else
          render_500
.
.
.


De todas formas, si alguien sabe la forma o conoce alguna referencia
para informarme le estaria muy agradecio pues en un futuro nunca se sabe
que se tendra que usar.

Gracias
49b6123803e4f327144e991daab62f77?d=identicon&s=25 Daniel Rodriguez Troitiño (Guest)
on 2009-05-06 16:09
(Received via mailing list)
2009/5/6 Jose vicente Ribera pellicer
<ruby-forum-incoming@andreas-s.net>:
>
>
> Me gustaria saber si seria algo parecido a esto, ya que tocar el Apache
> me impone un poco de respeto...
>
> Saludos

Por que quede también está posible solución completa en la lista:

Crea un archivo blank.txt totalmente vacio en la raíz del server (por
ejemplo con touch blank.txt). Incluye estas líneas en tu .htaccess:

RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^OPTION$
RewriteRule . /blank.txt [L]

Y voila! debería enviar el contenido en blanco y un HTTP 200 OK como
respuesta.

Suerte.
5c15703984caa012845b3cea129da936?d=identicon&s=25 Manuel González Noriega (Guest)
on 2009-05-06 16:26
(Received via mailing list)
2009/5/6 Daniel Rodriguez Troitiño <notzcoolx@yahoo.es>

>
>
Por ser respetuosos con el medio ambiente: el 200 OK es incorrecto.
Deberia
devolverse un 501 Not Implemented

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

"The server does not support the functionality required to fulfill the
request. This is the appropriate response when the server does not
recognize
the request method and is not capable of supporting it for any
resource."
3bad218882602f4c35ea15adb3e5d5a4?d=identicon&s=25 Fernando Calatayud (fernan2)
on 2009-05-06 20:01
Yo voto por un 405 Method_Not_Allowed, ya que es la respuesta a una
petición con el método OPTIONS.

Pero desde luego, no un 200 OK.

s2
5c15703984caa012845b3cea129da936?d=identicon&s=25 Manuel González Noriega (Guest)
on 2009-05-06 23:32
(Received via mailing list)
2009/5/6 Fernando Calatayud <ruby-forum-incoming@andreas-s.net>

>
> Yo voto por un 405 Method_Not_Allowed, ya que es la respuesta a una
> petición con el método OPTIONS.
>
> Pero desde luego, no un 200 OK.
>

Buen punto. Yo creo que un 405 es el adecuado para un método reconocido,
pero no permitido, vamos "no allowed". Es decir, el típico post contra
un
recurso que solo acepta gets.

Ya que no se trata de permitir o no permitir, sino de que el servidor
reconozca el método, sigo votando por el 501.

Me encantan las discusiones sobre status http :)
0fdce938a28a604fd5613a68b0d78fcb?d=identicon&s=25 Jose vicente Ribera pellicer (joripel)
on 2009-05-07 09:36
>
> Crea un archivo blank.txt totalmente vacio en la raíz del server (por
> ejemplo con touch blank.txt). Incluye estas líneas en tu .htaccess:
>
> RewriteEngine On
> RewriteCond %{REQUEST_METHOD} ^OPTION$
> RewriteRule . /blank.txt [L]
>
> Y voila! debería enviar el contenido en blanco y un HTTP 200 OK como
> respuesta.
>
> Suerte.


Gracias Daniel!!. Por cierto si como han comentado en el hilo en vez de
enviar un HTTP 200 ok quisiera enviar un 405 o un 501 como lo
especificaria??.

Porque el hecho de crear el archivo vacio es para que no devuelva nada y
supongo que el 200 es el que se toma por defecto si no se dice nada
(vamos que todo ha ido bien).


PD. sabeis de algun manual/tutorial que me pueda servir para ponerme las
pilas en este tema. Ayer googleando solo encontre entradas muy
especificas sobre apache, pero nada parecido a un tutorial.

S2
39086eb3d9a1437276d07c08ea0c3821?d=identicon&s=25 Guillermo (Guest)
on 2009-05-07 11:59
(Received via mailing list)
Estais alterando el comportamiento normal de rails, que por defecto
cuando
le hacen un options devuelve un method not allowed.
El problema es que esa operación enviaba mails, y en vez de hacer que no
envíe mails, estáis alterando el correcto comportamiento de rails.

Si no vas a usar el verbo options, en la documentación de apache tienes
la
forma de limitar los verbos que quieres.
http://httpd.apache.org/docs/2.2/mod/core.html#limitexcept

En nginx parece que también se puede, aunque usando rewrite
http://wiki.nginx.org/NginxRewriteMultiCondExample

Pero tanto apache como nginx hace un montón que no los toco.
0fdce938a28a604fd5613a68b0d78fcb?d=identicon&s=25 Jose vicente Ribera pellicer (joripel)
on 2009-05-07 12:03
Guillermo wrote:
> Estais alterando el comportamiento normal de rails, que por defecto
> cuando
> le hacen un options devuelve un method not allowed.
> El problema es que esa operación enviaba mails, y en vez de hacer que no
> envíe mails, estáis alterando el correcto comportamiento de rails.
>
> Si no vas a usar el verbo options, en la documentación de apache tienes
> la
> forma de limitar los verbos que quieres.
> http://httpd.apache.org/docs/2.2/mod/core.html#limitexcept
>
> En nginx parece que también se puede, aunque usando rewrite
> http://wiki.nginx.org/NginxRewriteMultiCondExample
>
> Pero tanto apache como nginx hace un montón que no los toco.



Thanks por la info ;)
This topic is locked and can not be replied to.