Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to fix the Dropping Close since the SSL connection is already closing error in spray

I’m making a call to an API, but most of the time I keep getting an error: “Dropping Close since the SSL connection is already closing” and “Premature connection close (the server doesn't appear to support request pipelining).” Like 90% of the time I get that error, meaning: on very rare occasions the query does return the data it supposed to.

To make sure this wasn’t the API’s server issue, I replicate the same query using Node.js (Express and Request libs) and it works every time. It makes me almost sure is a spray bug.

Here's an example of the code:

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 

Error Detail:

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 

And I was able to reproduce the error in all of these versions:

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 
like image 688
maya.js Avatar asked Apr 01 '15 17:04

maya.js


1 Answers

as you said,

To make sure this wasn’t the API’s server issue, I replicate the same query using Node.js (Express and Request libs) and it works every time. It makes me almost sure is a spray bug.

your code in scala send requests with HTTP pipelining feature, do you send the requests with HTTP pipelining feature while you testing with nodejs?

for error message:

the server doesn't appear to support request pipelining

you should make sure:

  1. please make sure that the server support the pipelining feature, and the pipelining feature is enable.
  2. if there are proxies between your client and server(include reverse proxy), please make sure that the proxies support pipelining feature, and the pipelining feature is enable.

If you can't make sure the pipelining feature can be supported properly, you should not use it.

following resource may helpful:

HTTP pipelining requires both the client and the server to support it. HTTP/1.1 conforming servers are required to support pipelining. This does not mean that servers are required to pipeline responses, but that they are required not to fail if a client chooses to pipeline requests.[7]

https://en.wikipedia.org/wiki/HTTP_pipelining

HTTP pipelining is not activated by default in modern browsers:

Buggy proxies are still common and these lead to strange and erratic behaviors that Web developers cannot foresee and diagnose easily. Pipelining is complex to implement correctly: the size of the resource being transferred, the effective RTT that will be used, as well as the effective bandwidth, have a direct incidence on the improvement provided by the pipeline. Without knowing these, important messages may be delayed behind unimportant ones. The notion of important even evolves during page layout! HTTP pipelining therefore brings a marginal improvement in most cases only. Pipelining is subject to the HOL problem. For these reasons, pipelining has been superseded by a better algorithm, multiplexing, that is used by HTTP/2.

https://developer.mozilla.org/en-US/docs/Web/HTTP/Connection_management_in_HTTP_1.x$revision/1330814

like image 74
张飞飞飞飞飞 Avatar answered Sep 19 '22 16:09

张飞飞飞飞飞