Skip to content

Commit 121ee27

Browse files
starkillerOGfrenck
authored andcommitted
Reolink fix playback headers (#141015)
1 parent 5681f4f commit 121ee27

File tree

2 files changed

+34
-10
lines changed

2 files changed

+34
-10
lines changed

homeassistant/components/reolink/views.py

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,16 @@ async def get(
8383
_LOGGER.warning("Reolink playback proxy error: %s", str(err))
8484
return web.Response(body=str(err), status=HTTPStatus.BAD_REQUEST)
8585

86+
headers = dict(request.headers)
87+
headers.pop("Host", None)
88+
headers.pop("Referer", None)
89+
8690
if _LOGGER.isEnabledFor(logging.DEBUG):
91+
_LOGGER.debug(
92+
"Requested Playback Proxy Method %s, Headers: %s",
93+
request.method,
94+
headers,
95+
)
8796
_LOGGER.debug(
8897
"Opening VOD stream from %s: %s",
8998
host.api.camera_name(ch),
@@ -93,6 +102,7 @@ async def get(
93102
try:
94103
reolink_response = await self.session.get(
95104
reolink_url,
105+
headers=headers,
96106
timeout=ClientTimeout(
97107
connect=15, sock_connect=15, sock_read=5, total=None
98108
),
@@ -118,18 +128,25 @@ async def get(
118128
]:
119129
err_str = f"Reolink playback expected video/mp4 but got {reolink_response.content_type}"
120130
_LOGGER.error(err_str)
131+
if reolink_response.content_type == "text/html":
132+
text = await reolink_response.text()
133+
_LOGGER.debug(text)
121134
return web.Response(body=err_str, status=HTTPStatus.BAD_REQUEST)
122135

123-
response = web.StreamResponse(
124-
status=200,
125-
reason="OK",
126-
headers={
127-
"Content-Type": "video/mp4",
128-
},
136+
response_headers = dict(reolink_response.headers)
137+
_LOGGER.debug(
138+
"Response Playback Proxy Status %s:%s, Headers: %s",
139+
reolink_response.status,
140+
reolink_response.reason,
141+
response_headers,
129142
)
143+
response_headers["Content-Type"] = "video/mp4"
130144

131-
if reolink_response.content_length is not None:
132-
response.content_length = reolink_response.content_length
145+
response = web.StreamResponse(
146+
status=reolink_response.status,
147+
reason=reolink_response.reason,
148+
headers=response_headers,
149+
)
133150

134151
await response.prepare(request)
135152

@@ -141,7 +158,8 @@ async def get(
141158
"Timeout while reading Reolink playback from %s, writing EOF",
142159
host.api.nvr_name,
143160
)
161+
finally:
162+
reolink_response.release()
144163

145-
reolink_response.release()
146164
await response.write_eof()
147165
return response

tests/components/reolink/test_views.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,12 @@ def get_mock_session(
4646

4747
mock_response = Mock()
4848
mock_response.content_length = content_length
49+
mock_response.headers = {}
50+
mock_response.status = 200
51+
mock_response.reason = "OK"
4952
mock_response.content_type = content_type
5053
mock_response.content.iter_chunked = Mock(return_value=content)
54+
mock_response.text = AsyncMock(return_value="test")
5155

5256
mock_session = Mock()
5357
mock_session.get = AsyncMock(return_value=mock_response)
@@ -178,16 +182,18 @@ async def test_playback_proxy_timeout(
178182
assert response.status == 200
179183

180184

185+
@pytest.mark.parametrize(("content_type"), [("video/x-flv"), ("text/html")])
181186
async def test_playback_wrong_content(
182187
hass: HomeAssistant,
183188
reolink_connect: MagicMock,
184189
config_entry: MockConfigEntry,
185190
hass_client: ClientSessionGenerator,
191+
content_type: str,
186192
) -> None:
187193
"""Test playback proxy URL with a wrong content type in the response."""
188194
reolink_connect.get_vod_source.return_value = (TEST_MIME_TYPE_MP4, TEST_URL)
189195

190-
mock_session = get_mock_session(content_type="video/x-flv")
196+
mock_session = get_mock_session(content_type=content_type)
191197

192198
with patch(
193199
"homeassistant.components.reolink.views.async_get_clientsession",

0 commit comments

Comments
 (0)