Конвейеризация недопустимого заголовка ответа Scala Spray

Я получаю сообщение об ошибке, когда пытаюсь передать запрос из спрея Scala.

[play-akka.actor.default-dispatcher-14] INFO application - Pipelining chain request
[WARN] [03/19/2015 11:08:49.115] [application-akka.actor.default-dispatcher-2] [akka://application/user/IO-HTTP/group-0/0] Illegal response header: Illegal 'Access-Control-Allow-Origin' header: Unexpected end of input, expected $timesAccess$minusControl$minusAllow$minusOrigin (line 1, pos 1):

^

и вот где я строю запрос:

val pipeline =
  addCredentials(BasicHttpCredentials("API_KEY",
    "API_SECRET")) ~>  sendReceive

val response: Future[HttpResponse] = pipeline(Post(api,notification))
Logger.info("Pipelining chain request")
response

Я мало что знаю о Access Control Allow Origin. Нужно ли мне добавить какой-то заголовок к этому запросу, чтобы заставить его работать?


person Chris Stewart    schedule 19.03.2015    source источник


Ответы (1)


Сама ошибка означает, что заголовок Access-Control-Allow-Origin был не проанализирован правильно (см. грамматика). Этот заголовок довольно новый и позволяет Обмен ресурсами между источниками. Примеры обычных Access-Control-Allow-Origin(от здесь):

"Access-Control-Allow-Origin" in {
  "Access-Control-Allow-Origin: *" =!= `Access-Control-Allow-Origin`(AllOrigins)
  "Access-Control-Allow-Origin: null" =!= `Access-Control-Allow-Origin`(SomeOrigins(Nil))
  "Access-Control-Allow-Origin: http://spray.io" =!= `Access-Control-Allow-Origin`(SomeOrigins(Seq("http://spray.io")))
}

Я могу предположить, что вы можете использовать какую-то старую версию спрея, которая не поддерживает несколько источников или, возможно, связана с это. В любом случае, сервер возвращает ответ с этим заголовком только в том случае, если в запросе указан заголовок Origin (что означает инициацию CORS), поэтому проблема должна решаться удалением из него заголовка Origin.

ОБНОВЛЕНИЕ: это ошибка используемого вами API chain.com. Если заголовок Origin не указан, они возвращают вам Access-Control-Allow-Origin: (пустую строку), поэтому его невозможно разобрать:

> curl -v https://api.chain.com/v2/notifications -X POST
> POST /v2/notifications HTTP/1.1
> User-Agent: curl/7.41.0
> Host: api.chain.com
> Accept: */*
>
< HTTP/1.1 401 Unauthorized
< Access-Control-Allow-Credentials: true
< Access-Control-Allow-Methods: GET,POST,PATCH,PUT,DELETE,OPTIONS,HEAD
< Access-Control-Allow-Origin:
< Content-Type: text/plain; charset=utf-8
< Date: Sun, 22 Mar 2015 01:38:07 GMT
< Strict-Transport-Security: max-age=25920000; includeSubDomains
< Vary: Accept-Encoding
< Www-Authenticate: Basic realm="chain-api"
< X-Content-Type-Options: nosniff
< X-Frame-Options: DENY
< X-Xss-Protection: 1
< Content-Length: 47
< Connection: keep-alive
<
{"code":"CH004","message":"Must authenticate"}

Вы должны указать некоторые Origin в качестве обходного пути:

>curl -v https://api.chain.com/v2/notifications -X POST -H "Origin: http://google.com"
> POST /v2/notifications HTTP/1.1
> User-Agent: curl/7.41.0
> Host: api.chain.com
> Accept: */*
> Origin: http://google.com

< HTTP/1.1 401 Unauthorized
< Access-Control-Allow-Credentials: true
< Access-Control-Allow-Methods: GET,POST,PATCH,PUT,DELETE,OPTIONS,HEAD
< Access-Control-Allow-Origin: http://google.com
< Content-Type: text/plain; charset=utf-8
< Date: Sun, 22 Mar 2015 01:39:10 GMT
< Strict-Transport-Security: max-age=25920000; includeSubDomains
< Vary: Accept-Encoding
< Www-Authenticate: Basic realm="chain-api"
< X-Content-Type-Options: nosniff
< X-Frame-Options: DENY
< X-Xss-Protection: 1
< Content-Length: 47
< Connection: keep-alive
person dk14    schedule 22.03.2015
comment
Вот API, который я пытаюсь вызвать chain.com/docs#notifications-create. - person Chris Stewart; 22.03.2015
comment
это ошибка chain.com API - они отправляют вам Access-Control-Allow-Origin со значением (пустая строка, не поддающаяся разбору), если заголовок Origin не указан, возможное обходное решение состоит в том, чтобы фактически указать этот заголовок Origin. - person dk14; 22.03.2015
comment
Чем бы я заполнил заголовок источника? Буду ли я заполнять это при обработке ответа или отправке запроса? - person Chris Stewart; 22.03.2015
comment
при отправке запроса (я добавил пример). Вы можете использовать любой допустимый URI (например, htttp://example.com) — это не имеет значения, так как это обходной путь. - person dk14; 22.03.2015
comment
Итак, в моем примере у меня было бы что-то вроде addHeader("Origin", "mydomain.com") - person Chris Stewart; 22.03.2015
comment
Извините, я не могу назначить награду еще 16 часов. Я отдам его тебе, когда истечет срок блокировки. - person Chris Stewart; 22.03.2015