fix: proxy rotation page pool leak (#223)
This commit is contained in:
@@ -196,11 +196,14 @@ class SyncSession:
|
|||||||
context_options = self._build_context_with_proxy(proxy)
|
context_options = self._build_context_with_proxy(proxy)
|
||||||
context: BrowserContext = self.browser.new_context(**context_options)
|
context: BrowserContext = self.browser.new_context(**context_options)
|
||||||
|
|
||||||
|
page_info = None
|
||||||
try:
|
try:
|
||||||
context = self._initialize_context(self._config, context)
|
context = self._initialize_context(self._config, context)
|
||||||
page_info = self._get_page(timeout, extra_headers, disable_resources, blocked_domains, context=context)
|
page_info = self._get_page(timeout, extra_headers, disable_resources, blocked_domains, context=context)
|
||||||
yield page_info
|
yield page_info
|
||||||
finally:
|
finally:
|
||||||
|
if page_info is not None and page_info in self.page_pool.pages:
|
||||||
|
self.page_pool.pages.remove(page_info)
|
||||||
context.close()
|
context.close()
|
||||||
else:
|
else:
|
||||||
# Standard mode: use PagePool with persistent context
|
# Standard mode: use PagePool with persistent context
|
||||||
@@ -380,6 +383,7 @@ class AsyncSession:
|
|||||||
context_options = self._build_context_with_proxy(proxy)
|
context_options = self._build_context_with_proxy(proxy)
|
||||||
context: AsyncBrowserContext = await self.browser.new_context(**context_options)
|
context: AsyncBrowserContext = await self.browser.new_context(**context_options)
|
||||||
|
|
||||||
|
page_info = None
|
||||||
try:
|
try:
|
||||||
context = await self._initialize_context(self._config, context)
|
context = await self._initialize_context(self._config, context)
|
||||||
page_info = await self._get_page(
|
page_info = await self._get_page(
|
||||||
@@ -387,6 +391,8 @@ class AsyncSession:
|
|||||||
)
|
)
|
||||||
yield page_info
|
yield page_info
|
||||||
finally:
|
finally:
|
||||||
|
if page_info is not None and page_info in self.page_pool.pages:
|
||||||
|
self.page_pool.pages.remove(page_info)
|
||||||
await context.close()
|
await context.close()
|
||||||
else:
|
else:
|
||||||
# Standard mode: use PagePool with persistent context
|
# Standard mode: use PagePool with persistent context
|
||||||
|
|||||||
@@ -84,6 +84,15 @@ class TestPagePool:
|
|||||||
with pytest.raises(RuntimeError):
|
with pytest.raises(RuntimeError):
|
||||||
pool.add_page(Mock())
|
pool.add_page(Mock())
|
||||||
|
|
||||||
|
def test_proxy_rotation_pool_leak(self):
|
||||||
|
pool = PagePool(max_pages=1)
|
||||||
|
page_info = pool.add_page(Mock())
|
||||||
|
assert pool.pages_count == 1
|
||||||
|
pool.pages.remove(page_info)
|
||||||
|
assert pool.pages_count == 0
|
||||||
|
pool.add_page(Mock())
|
||||||
|
assert pool.pages_count == 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def test_cleanup_error_pages(self):
|
def test_cleanup_error_pages(self):
|
||||||
|
|||||||
Reference in New Issue
Block a user