HTTP 303 ORDS de Oracle

Sep 10 2020

Necesito redirigir al usuario a otro punto final después de que haga un POST, pero el otro punto final solo acepta solicitudes GET.

Como dice la wiki, el código HTTP 303 debería decirle al cliente que envíe una solicitud a otra ubicación y cambie el método a GET:

Si un servidor responde a un POST u otra solicitud no idempotente con una respuesta 303 Ver otro y un valor para el encabezado de ubicación, se espera que el cliente obtenga el recurso mencionado en el encabezado de ubicación utilizando el método GET ( fuente ).

Pero después de la respuesta, el cliente redirige usando POST nuevamente. Probé el punto final con Insomnia y aquí está la salida de la línea de tiempo:

* Preparing request to http://******:8080/ords/demo/llmob.test_post_david
* Current time is 2020-09-10T07:21:09.418Z
* Using libcurl/7.69.1 OpenSSL/1.1.1e zlib/1.2.11 brotli/1.0.7 libidn2/2.2.0 libssh2/1.9.0 nghttp2/1.29.0
* Using default HTTP version
* Disable timeout
* Enable automatic URL encoding
* Enable SSL validation
* Enable cookie sending with jar of 5 cookies
* Connection 21 seems to be dead!
* Closing connection 21
* Hostname ****** was found in DNS cache
*   Trying 192.168.254.135:8080...
* Connected to ****** (192.168.254.135) port 8080 (#22)

> POST /ords/demo/llmob.test_post_david HTTP/1.1
> Host: ******:8080
> User-Agent: insomnia/2020.3.3
> Access-Control-Allow-Origin: *
> Content-Type: multipart/form-data; boundary=X-INSOMNIA-BOUNDARY
> Accept: */*
> Content-Length: 433

| --X-INSOMNIA-BOUNDARY
| Content-Disposition: form-data; name="ShoppingCartID"
| 78


* We are completely uploaded and fine
* Mark bundle as not supporting multiuse

< HTTP/1.1 303 
< Location: http://******:8080/ords/devapex/sbas/r/self-check-out159/odobreno
< Transfer-Encoding: chunked
< Date: Thu, 10 Sep 2020 07:21:10 GMT


* Ignoring the response-body
* Received 5 B chunk
* Connection #22 to host ****** left intact
* Issue another request to this URL: 'http://******:8080/ords/devapex/sbas/r/self-check-out159/odobreno'
* Disables POST, goes with GET
* Found bundle for host ******: 0x1497368c8870 [serially]
* Can not multiplex, even if we wanted to!
* Re-using existing connection! (#22) with host ******
* Connected to ****** (192.168.254.135) port 8080 (#22)

> POST /ords/devapex/sbas/r/self-check-out159/odobreno HTTP/1.1
> Host: ******:8080
> User-Agent: insomnia/2020.3.3
> Access-Control-Allow-Origin: *
> Content-Type: multipart/form-data; boundary=X-INSOMNIA-BOUNDARY
> Accept: */*
> Content-Length: 433

| --X-INSOMNIA-BOUNDARY
| Content-Disposition: form-data; name="ShoppingCartID"
| 78

* We are completely uploaded and fine
* Mark bundle as not supporting multiuse

< HTTP/1.1 405 
< Allow: GET
< Content-Type: text/html
< Content-Length: 15798
< Date: Thu, 10 Sep 2020 07:21:10 GMT


* Received 7.9 KB chunk
* Received 7.5 KB chunk
* Connection #22 to host ****** left intact

La primera respuesta se genera con el OWA_UTILpaquete de la siguiente manera:

 owa_util.status_line(
                         nstatus=> 303, bclose_header=> false
                         );
                         
   owa_util.redirect_url(
             curl         => 'http://******:8080/ords/devapex/sbas/r/self-check-out159/odobreno',
            bclose_header  =>TRUE
            );

ORDS versión 18.4.

Actualizar

Cuando se emite la misma solicitud desde el navegador, el código de respuesta es 403 (error a continuación) y la redirección nunca ocurre.

La solicitud no se puede procesar porque este recurso no admite solicitudes de uso compartido de origen cruzado o la solicitud Origin no está autorizada para acceder a este recurso. Si ords se está utilizando como proxy inverso, asegúrese de que el servidor de front-end esté propagando el nombre de host, para mod_proxy asegúrese de que ProxyPreserveHost esté activado

Respuestas

EJEgyed Sep 22 2020 at 20:59

Si su punto final al que intenta reenviar al usuario está en el mismo host / módulo, puede usar el :FORWARD_LOCATIONparámetro de vinculación implícita que se introdujo en ORDS 18.3.

De lo contrario, en lugar de usar OWA_UTILpara establecer la nueva ubicación a la que se debe redirigir al usuario, intente usar los encabezados de respuesta ORDS. Tengo un ejemplo de cómo hacer esto aquí .