Os cabeçalhos desaparecem no teste de integração no serviço REST

9

Eu tenho um teste de integração no meu aplicativo Grails 3.2.2 que deve verificar se o suporte ao CORS está operacional. Quando inicio o aplicativo e uso algo como Paw ou Postman para fazer uma solicitação, o ponto de interrupção que eu configurei no CorsFilter mostra que meus cabeçalhos estão configurados corretamente. Mas quando eu faço o mesmo pedido de um teste de integração usando RestBuilder com o seguinte código:

void "Test request http OPTIONS"() {
    given: "JSON content request"

    when: "OPTIONS are requested"
    def rest = new RestBuilder()
    def optionsUrl = url(path)
    def resp = rest.options(optionsUrl) {
        header 'Origin', 'http://localhost:4200'
        header 'Access-Control-Request-Method', 'GET'
    }

    then: "they are returned"
    resp.status == HttpStatus.SC_OK
    !resp.json
}

O ponto de interrupção no CorsFilter mostra que ambos os cabeçalhos são nulos:

EomaisestranhoéquequandoeucolocoumpontodeinterrupçãonoRestTemplate,logoantesdarequisiçãoserexecutada,oscabeçalhosestãolá:

Eu não entendo como esses cabeçalhos podem desaparecer. Alguma idéia?

    
por Sebastien 15.11.2016 в 14:28
fonte

2 respostas

2

Eu estava trabalhando neste problema problema recentemente, e embora eu não saiba onde o RestBuilder está suprimindo o cabeçalho Origin, eu criei uma solução alternativa para testar se o suporte CORS grails está operando como configurado: usando o HTTPBuilder em vez de RestBuilder para invocar o serviço.

Depois de adicionar org.codehaus.groovy.modules.http-builder:http-builder:0.7.1 como uma dependência testCompile em build.gradle e com grails.cors.allowedOrigins definido como http://localhost , os seguintes testes funcionaram como desejado:

import geb.spock.GebSpec
import grails.test.mixin.integration.Integration
import groovyx.net.http.HTTPBuilder
import groovyx.net.http.HttpResponseException
import groovyx.net.http.Method

@Integration
class ExampleSpec extends GebSpec {
    def 'verify that explicit, allowed origin works'() {
        when:
        def http = new HTTPBuilder("http://localhost:${serverPort}/todo/1")
        def result = http.request(Method.GET, "application/json") { req ->
            headers.'Origin' = "http://localhost"
        }

        then:
        result.id == 1
        result.name == "task 1.1"
    }

    def 'verify that explicit, disallowed origin is disallowed'() {
        when:
        def http = new HTTPBuilder("http://localhost:${serverPort}/todo/1")
        http.request(Method.GET, "application/json") { req ->
            headers.'Origin' = "http://foobar.com"
        }

        then:
        HttpResponseException e = thrown()
        e.statusCode == 403
    }
}
    
por Wes Price 23.11.2016 / 20:44
fonte
0

Teve o mesmo problema. Depois de algumas pesquisas, descobri: link , ele suporta o envio de 'Origem' e solicitações de opções.

 import grails.test.mixin.integration.Integration
 import grails.transaction.Rollback
 import groovy.util.logging.Slf4j
 import org.apache.http.client.HttpClient
 import org.apache.http.client.methods.HttpOptions
 import org.apache.http.impl.client.MinimalHttpClient
 import org.apache.http.impl.conn.BasicHttpClientConnectionManager
 import spock.lang.Specification

 @Integration
 @Rollback
 @Slf4j
 class CorsIntegrationSpec  extends Specification {

     def 'call with origin'() {
         when:
         def response = call(["Origin":"test","Content-Type":"application/json"])
         then:
         response != null
         response.getStatusLine().getStatusCode() == 200
         response.containsHeader("Access-Control-Allow-Origin")
         response.containsHeader("Access-Control-Allow-Credentials")
         response.containsHeader("Access-Control-Allow-Headers")
         response.containsHeader("Access-Control-Allow-Methods")
         response.containsHeader("Access-Control-Max-Age")
     }  

     private call (Map<String, String> headers) {
         HttpOptions httpOptions = new HttpOptions("http://localhost:${serverPort}/authz/token")
         headers.each { k,v ->
             httpOptions.setHeader(k,v)
         }
         BasicHttpClientConnectionManager manager = new BasicHttpClientConnectionManager()
         HttpClient client = new MinimalHttpClient(manager)
         return client.execute(httpOptions)
     }
 }
    
por HuTa 20.04.2017 / 14:24
fonte