2013-09-22 3 views
5

Ich versuche spray-client und spray-httpx zu verwenden, und ich habe Probleme, herauszufinden, wie ‚Set-Cookie‘ Header von HttpResponse zu einem ‚Cookie‘ Header zu konvertieren, die ich auf eine HttpRequestWie konvertiert man aus der 'set-cookie' Header-Antwort, um 'cookie' Header im Spray zu beantragen?

val responseSetCookieHeaders = response.headers filter { _.name == "Set-Cookie" } 
... 
val requestCookieHeader:HttpHeader = ??? 
... 
addHeader(requestCookieHeader) ~> sendReceive ~> { response => ??? } 
einstellen möchte

ich sehe spray.http.HttpHeaders.Cookie, aber ich sehe keine Möglichkeit, von einer Instanz von HttpHeader-HttpCookie ...

mit einer unapply Methode

Antwort

10

HttpHeaders.Cookie ist ein Fall, Klasse zu konvertieren. So können Sie es von Reaktion mit einer einfachen Funktion extrahieren:

def getCookie(name: String): HttpHeader => Option[HttpCookie] = { 
    case Cookie(cookies) => cookies.find(_.name == name) 
} 

, die ein bisschen allgemeinere Fall ist, aber ich denke, die Lösung klar ist.

Ich würde dies tun, auf folgende Weise:

// some example response with cookie 
val httpResponse = HttpResponse(headers = List(`Set-Cookie`(HttpCookie("a", "b")))) 

// extracting HttpCookie 
val httpCookie: List[HttpCookie] = httpResponse.headers.collect { case `Set-Cookie`(hc) => hc } 

// adding to client pipeline 
val pipeline = addHeader(Cookie(httpCookie)) ~> sendReceive 
+0

von dem, was ich die passenden sehen kann, sollte auf 'Set-Cookie' erfolgen: val responseSetCookieHeader: Httpheader = ???; responseSetCookieHeader Übereinstimmung {case HttpHeader.Set-Cookie' (c) => println (c.content)}. Danke, dass du mich auf den richtigen Weg gebracht hast! – Andrey

+0

im Grunde, ich landete tun: responseSetCookieHeaders map {case HttpHeaders.Set-Cookie' (c) => s "$ {c.name} = $ {c.content}"} mkString ";" wenn Sie Ihre aktualisieren Antwort mit passendem "Set-Cookie" anstelle von "Cookie" Ich akzeptiere es – Andrey

+0

@Andrey Ich habe meine Antwort aktualisiert, würde dieser Weg zu Ihnen passen? – 4lex1v