Как получить видео поток с Elixir/HTTPoison или Hackney?

Я пытаюсь получить поток с камеры с помощью Elixir / HTTPoison и записать его в файл. URL -адрес - xxxx/axis-cgi/mjpg/video.cgi? Duration=1& разрешение =320x240

Используя URL-адрес в DHC (Chrome addon), я могу иметь следующее:

Ответ 200 ОК

HEADERS Cache-Control: no-cache Pragma: no-cache Срок действия истекает: четверг, 01 декабря 1994 16:00:00 GMT Соединение: закрыто Content-Type: multipart/x-mixed-replace; border =myboundary X-Time-Offset: 62044.312573 довольно ПОЛНЫЕ ЗАПРОСЫ ЗАПРОСА Принять: / Accept-Encoding: gzip, deflate, sdch Accept-Language: fr-FR, fr; q = 0,8,en-US;q=0,6,en;q=0.4 Content-Type: application/xml User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, как Gecko) Chrome/52.0.2743.116 Safari/537.36 Примечание: XHR автоматически добавляет заголовки, такие как Accept, Accept-Language, Cookie, User-Agent и т. Д.

Сырое форматирование тела показывает мне много двоичных изображений в формате JPEG, разделенных --myboundary.

--myboundary

Тип контента: изображение / JPEG

Длина контента: 11848

JFIF W u]7W u] 7 2 ̎TY" C

Теперь я хочу попробовать то же самое с Эликсиром.

  test "request headers from cam" do
    options = [hackney: [basic_auth: {"login","password"}]]
    {:ok, %HTTPoison.AsyncResponse{id: id}} = HTTPoison.get "http://x.x.x.x/axis-cgi/mjpg/video.cgi?duration=1&resolution=320x240",[], [stream_to: self, recv_timeout: :infinity, hackney: options]
    assert_receive %HTTPoison.AsyncStatus{id: ^id, code: 200}, 1_000
  end

У меня есть следующий ответ,

  1) test request headers from cam (NewsequenceTest)
     test/newsequence_test.exs:9
     No message matching %HTTPoison.AsyncStatus{id: ^id, code: 200} after 1000ms.
     The following variables were pinned:
       id = #Reference<0.0.3.125>
     Process mailbox:
       %HTTPoison.AsyncStatus{code: 401, id: #Reference<0.0.3.125>}
       %HTTPoison.AsyncHeaders{headers: [{"Date", "Wed, 31 Aug 2016 06:47:00 GMT"}, {"Accept-Ranges", "bytes"}, {"Connection", "close"}, {"WWW-Authenticate", "Digest realm=\"AXIS_ACCC8E545922\", nonce=\"0000fa64Y50235919055a42f91d3dea744b10d2dab9653\", stale=FALSE, qop=\"auth\""}, {"WWW-Authenticate", "Basic realm=\"AXIS_ACCC8E545922\""}, {"Content-Length", "189"}, {"Content-Type", "text/html; charset=ISO-8859-1"}], id: #Reference<0.0.3.125>}
       %HTTPoison.AsyncChunk{chunk: "<HTML><HEAD><TITLE>401 Unauthorized</TITLE></HEAD>\n<BODY><H1>401 Unauthorized</H1>\nYour client does not have permission to get URL /axis-cgi/mjpg/video.cgi from this server.\n</BODY></HTML>\n", id: #Reference<0.0.3.125>}
       %HTTPoison.AsyncEnd{id: #Reference<0.0.3.125>}
     stacktrace:
       test/newsequence_test.exs:12: (test)

Я попытался без базовой аутентификации с тем же результатом.

Я еще не понимаю, что происходит с этой ошибкой аутентификации. Конечно, я что-то неправильно понял, может кто-нибудь просветить меня по этому вопросу?

С уважением,

пьер

1 ответ

Решение

Итак, проблема была в том, что код вызывал:

HTTPoison.get(..., [], [..., hackney: [hackney: [basic_auth: {"login","password"}]]])

вместо:

HTTPoison.get(..., [], [..., hackney: [basic_auth: {"login","password"}]])

что вызывало hackney игнорировать их, как он пытался получить opts[:hackney][:basic_auth] и т.д., которые были все nil,

Исправление должно заменить:

options = [hackney: [basic_auth: {"login","password"}]]

с

options = [basic_auth: {"login","password"}]
Другие вопросы по тегам