Как исправить Dropping Close, так как соединение SSL уже закрывает ошибку в спрее
Я звоню в API, но большую часть времени получаю сообщение об ошибке: " Отключение закрытия, так как соединение SSL уже закрывается " и " Преждевременное закрытие соединения (сервер не поддерживает конвейерную обработку запросов). "Как и в 90% случаев, я получаю эту ошибку, что означает: в очень редких случаях запрос возвращает данные, которые он должен был сделать.
Чтобы убедиться, что это не проблема сервера API, я повторяю один и тот же запрос, используя Node.js (Express и Request libs), и он работает каждый раз. Это делает меня почти уверен, что это спрей ошибка.
Вот пример кода:
case class MyClass(user: String, pass: String)
class MyActor extends Actor {
import spray.client.pipelining._
import spray.http.BasicHttpCredentials
import spray.http.{HttpRequest,HttpResponse}
import scala.concurrent.Future
import context.dispatcher
def receive = {
case myClass: MyClass => {
val credentials: BasicHttpCredentials = BasicHttpCredentials(myClass.user, myClass.pass)
val url: String = "https://myApi?params=values"
val request: HttpRequest = Get(url) ~> addCredentials(credentials)
val pipeline = sendReceive
val response: Future[HttpResponse] = pipeline(request)
val finalRes: Future[String] = response.map{ r =>
println(r)
r.entity.asString
}
finalRes pipeTo sender
}
} // end receive
} //end Actor
Деталь ошибки:
04/01 10:19:05 DEBUG[on-spray-can-akka.actor.default-dispatcher-8] a.i.TcpOutgoingConnection - Attempting connection to ...
04/01 10:19:05 DEBUG[on-spray-can-akka.actor.default-dispatcher-6] a.i.TcpOutgoingConnection - Connection established to ...
04/01 10:19:05 DEBUG[on-spray-can-akka.actor.default-dispatcher-6] s.c.c.HttpClientConnection - Connected to ...
04/01 10:19:05 DEBUG[on-spray-can-akka.actor.default-dispatcher-9] s.c.c.HttpHostConnectionSlot - Connection to ... established, dispatching 1 pending requests
04/01 10:19:05 DEBUG[on-spray-can-akka.actor.default-dispatcher-3] s.c.c.HttpClientConnection - now monitoring Actor[akka://on-spray-can/system/IO-TCP/selectors/$a/5]
04/01 10:19:05 DEBUG[on-spray-can-akka.actor.default-dispatcher-6] s.c.c.HttpHostConnectionSlot - Dispatching GET request to /api?params=values across connection Actor[akka://on-spray-can/user/IO-HTTP/group-0/4]
04/01 10:19:05 DEBUG[on-spray-can-akka.actor.default-dispatcher-6] s.c.c.HttpHostConnectionSlot - now monitoring Actor[akka://on-spray-can/user/IO-HTTP/group-0/4]
04/01 10:19:06 DEBUG[on-spray-can-akka.actor.default-dispatcher-3] s.c.c.HttpClientConnection - Dropping Close since the SSL connection is already closing
04/01 10:19:06 DEBUG[on-spray-can-akka.actor.default-dispatcher-3] s.c.c.HttpClientConnection - Connection was PeerClosed, awaiting TcpConnection termination...
04/01 10:19:06 DEBUG[on-spray-can-akka.actor.default-dispatcher-3] a.i.TcpOutgoingConnection - stopped
04/01 10:19:06 DEBUG[on-spray-can-akka.actor.default-dispatcher-3] s.c.c.HttpClientConnection - TcpConnection terminated, stopping
04/01 10:19:06 WARN [on-spray-can-akka.actor.default-dispatcher-3] s.c.c.HttpHostConnectionSlot - Premature connection close (the server doesn't appear to support request pipelining) in response to GET request to /myApi?params=values with 1 retries left, retrying...
04/01 10:19:06 DEBUG[on-spray-can-akka.actor.default-dispatcher-3] s.c.c.HttpClientConnection - stopped
И мне удалось воспроизвести ошибку во всех этих версиях:
spray 1.0.1; akka 2.0.5; scala 2.9.3
spray 1.2.1; akka 2.2.4; scala 2.10.1
spray 1.3.1; akka 2.3.0; scala 2.10.3
spray 1.3.2; akka 2.3.6; scala 2.11.4
spray 1.3.3; akka 2.3.9; scala 2.11.6
2 ответа
Как вы сказали,
Чтобы убедиться, что это не проблема сервера API, я повторяю один и тот же запрос, используя Node.js (Express и Request libs), и он работает каждый раз. Это делает меня почти уверен, что это спрей ошибка.
Ваш код в Scala отправляет запросы с функцией конвейерной передачи HTTP, отправляете ли вы запросы с функцией конвейерной передачи HTTP во время тестирования с помощью nodejs?
для сообщения об ошибке:
сервер не поддерживает конвейерную обработку запросов
Вы должны убедиться:
- убедитесь, что сервер поддерживает функцию конвейерной передачи, а функция конвейерной передачи включена.
- если между вашим клиентом и сервером есть прокси-серверы (включая обратный прокси-сервер), убедитесь, что прокси-серверы поддерживают функцию конвейерной передачи, а функция конвейерной передачи включена.
Если вы не можете убедиться, что функция конвейерной обработки поддерживается должным образом, вы не должны использовать ее.
может пригодиться следующий ресурс:
HTTP конвейерная обработка требует, чтобы клиент и сервер поддержали это. Для поддержки конвейеризации требуются серверы, соответствующие HTTP/1.1. Это не означает, что серверы должны передавать ответы, но они не должны давать сбой, если клиент выбирает конвейерные запросы. [7]
https://en.wikipedia.org/wiki/HTTP_pipelining
HTTP-конвейеризация не активируется по умолчанию в современных браузерах:
Багги-прокси по-прежнему широко распространены, и они приводят к странным и ошибочным поведениям, которые веб-разработчики не могут предвидеть и легко диагностировать. Конвейерная обработка сложна для правильной реализации: размер передаваемого ресурса, эффективный RTT, который будет использоваться, а также эффективная пропускная способность, напрямую влияют на улучшение, обеспечиваемое конвейером. Не зная об этом, важные сообщения могут быть отложены за незначительными. Понятие важности даже развивается во время макета страницы! Поэтому конвейерная обработка HTTP приносит незначительное улучшение только в большинстве случаев. Трубопроводы являются предметом проблемы HOL. По этим причинам конвейеризация была заменена лучшим алгоритмом мультиплексирования, который используется HTTP / 2.
https://developer.mozilla.org/en-US/docs/Web/HTTP/Connection_management_in_HTTP_1.x$ revision / 1330814
Для меня добавление строки ниже в
application.conf
решил проблему
spray.can.client.parsing.max-response-reason-length = 256