Протокол HTTP2 с URLSessionStreamTask - PullRequest
2 голосов
/ 26 марта 2019

Я пытаюсь создать клиентскую сторону iOS из Alexa Voice Services . Я застрял на сетевом уровне.

Взаимодействие с сервером Alexa требует создания в основном двух потоков через одно соединение. После создания соединения с сервером вы открываете поток downchannel , который будет в полузакрытом состоянии. downchannel будет использоваться сервером для отправки директив, таких как уведомления, тревоги и т. Д. (Например, если вы попросите Alexa установить будильник через 5 минут, вы получите директиву для включения тревоги на этом канале через 5 минут ). нисходящий канал будет открыт, пока активна сессия с Alexa . Другой поток будет запускаться всякий раз, когда пользователь начинает аудио сеанс с Alexa. Этот поток будет использоваться для отправки звуковых фрагментов , пока мы не получим end директиву . Затем этот поток будет закрыт. Подробнее здесь

Я пытаюсь реализовать это, используя streamTaskWithHostName (: portNumber:) URLSession. Так что для простого 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. Можете ли вы помочь мне с некоторыми библиотеками, которые могут помочь мне в достижении того же.

...