带有URLSessionStreamTask的HTTP2协议

时间:2019-03-26 06:27:58

标签: ios networking http2 alexa-voice-service urlsession

我正在尝试构建 Alexa语音服务的iOS客户端。我陷入了网络层。

与Alexa Server的交互需要在单个连接上主要创建两个流。与服务器建立连接后,打开下行频道流,该流将处于半关闭状态。服务器将使用 downchannel 发送指令,例如通知,警报等(例如,如果您要求Alexa在5分钟后设置警报,则您将获得指令在5分钟后在此频道上播放警报分钟)。只要与Alexa的会话处于活动状态, 下行频道 就会打开。每当用户启动与Alexa的音频会话时,就会开始另一个流。该流将用于发送音频块,直到获得 end指令。然后该流将关闭。 More Details here

我正在尝试使用URLSession的 streamTaskWithHostName(:portNumber:)实施此操作。因此,对于简单的HTTP请求(如果我正在发送HTTP请求),我可以读取响应,并且只需要按照标准解析标头和正文即可。

let request = "GET / HTTP/1.1 \r\nHost: localhost\r\n\r\n"
streamTask = session.streamTask(withHostName: "localhost", port: 8080)
let getRequest = request.data(using: .utf8)!
streamTask.write(getRequest, timeout: 60) {
        error in
         debugPrint("Error is \(error?.localizedDescription)  )")
        if error == nil {
            self.streamTask.readData(ofMinLength: 4096, maxLength: 4096, timeout: 20) {
                data, bool, error in
                if let extractedData = data {
                    let dataString = String(data: extractedData, encoding: .utf8)
                    debugPrint("Data received is \(dataString!)")
                }
                debugPrint("Bool = \(bool)  error = \(error?.localizedDescription)")
            }
        }
    }


    streamTask.resume()

我正在读取的数据是

  Data received is HTTP/1.1 200 \r\nDate: Tue, 26 Mar 2019 06:08:33 GMT\r\nServer: Apache/2.4.38 (Unix)\r\nContent-Length: 226\r\nConnection: close\r\nContent-Type: text/html; charset=iso-8859-1\r\n\r\n<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n<html><head>\n<title>it works</title>\n</head><body>\n<h1>it workst</h1>\n<p>it works.<br />\n</p>\n</body></html>\n"

但是当我尝试创建http2流任务时,我什么也看不懂。

  :method = GET  
  :scheme = https  
  :path = /{{API version}}/directives
  authorization = Bearer {{YOUR_ACCESS_TOKEN}}  

1。是因为http2是二进制协议而不是纯文本,并且使用HPACK压缩了标头吗?

2。如果是,那么我是否需要根据文档自己实现标题压缩,帧创建和写入流,或者URLSessionConfiguration中是否有一些配置可以为我做到这一点,即使我将普通标题指定为在URLRequests中?

3。能为我提供一些可以帮助我实现这些目标的库吗?

0 个答案:

没有答案