2013-05-02 9 views
7

Documentazione states che spray è in grado di gestire le risposte bocciate ma non riesco a trovare alcun esempio per iniziare. C'è la mia ingenua implementazione:Gestione risposta in chunked con spray example

object Main extends App { 

    implicit val system = ActorSystem() 
    import system.dispatcher 
    val log = Logging(system, getClass) 
    val ioBridge = IOExtension(system).ioBridge() 
    val httpClient = system.actorOf(Props(new HttpClient(ioBridge))) 

    val conduit = system.actorOf(
    props = Props(new HttpConduit(httpClient, "localhost", 3000)), 
    name = "http-conduit" 
) 

    val pipeline = HttpConduit.sendReceive(conduit) 
    val response = pipeline(
    HttpRequest(
     method = GET, 
     uri = "/output.cgi.xml" 
    ) 
) 

    response onComplete { 
    case Success(a) => 
     log.info("Success: " + a) 
     system.shutdown() 

    case Failure(error) => 
     log.error(error, "Failure") 
     system.shutdown() 
    } 

} 

ho impostato response-chunk-aggregation-limit = 0, non succede nulla ancora.

Potete fornirmi un esempio di lettura di una risposta chunked?

Aggiornamento

Ho riscritto il mio codice come segue:

object Main extends App { 

    implicit val system = ActorSystem() 
    import system.dispatcher 
    val log = Logging(system, getClass) 
    val ioBridge = IOExtension(system).ioBridge() 
    val httpClient = system.actorOf(Props(new HttpClient(ioBridge))) 

    actor(new Act { 
    httpClient ! Connect(new InetSocketAddress("localhost", 3000)) 

    become { 
     case Connected(_) => 
     log.info("connected") 
     sender ! HttpRequest(GET, "/output.cgi.xml") 
     case Closed(handle, reason) => 
     log.info("closed: " + reason) 
     system.shutdown() 
     case ChunkedResponseStart(res) => 
     log.info("start: " + res) 
     case MessageChunk(body, ext) => 
     log.info("chunk: " + body) 
     case ChunkedMessageEnd(ext, trailer) => 
     log.info("end: " + ext) 
     case m => 
     log.info("received unknown message " + m) 
     system.shutdown() 
    } 
    }) 

} 

e ora sto ricevendo closed: ProtocolError(Aggregated response entity greater than configured limit of 1048576 bytes) subito dopo la connessione è stabilita.

mio application.conf

spray.can { 
    client { 
    response-chunk-aggregation-limit = 0 
    } 
} 
+0

WDYM con "non succede ancora nulla"? Stai dicendo che non hai mai ottenuto un risultato alla domanda? – jrudolph

+0

Quale versione di spray usi? – jrudolph

+0

Sto usando 1.1-M7. Voglio dire, non so come gestire la risposta in un modo chunked. Attualmente 'onComplete' riceve una risposta aggregata. – lambdas

risposta

9

Come avrete notato, HttpConduit funziona solo sulle risposte aggregate. Devi cadere nello strato di bomboletta spray per gestire singoli pezzi.

Sfortunatamente, al momento non abbiamo alcun esempio che indichi come lo faresti. Approssimativamente, funziona così (in M7):

  1. Set response-chunk-aggregation-limit = 0
  2. Invia Connect a HttpClient attore e attendere Connected
  3. Invia HttpRequest al mittente del Connected messaggio
  4. maniglia Chunked messaggi di richiesta ChunkedResponseStart, MessageChunk e ChunkedResponseEnd.

Per maggiori informazioni visita http://spray.io/documentation/spray-can/http-client/#chunked-responses

In contrasto con HttpConduit, questo significa che dovete gestire le connessioni voi stessi (se è per questo che si stava utilizzando HttpConduit). Negli ultimi notturni è diventato più semplice, perché il nuovo HttpClient supporta automaticamente i pool di connessione, ecc. Se è necessario, è possibile ottenere ulteriori informazioni sulla mailing list.

+0

Significa che il mio cliente riceverà ogni risposta abbastanza grande come blocchi, o un supporto speciale sul lato server è necessario? – lambdas

+0

Attualmente si ottengono blocchi solo se il server invia chunk. Ho aggiunto un ticket per supportare un'API chunk anche se la risposta effettiva non è frammentata sul filo: https://github.com/spray/spray/issues/281 – jrudolph

+0

Nice, grazie! – lambdas