matlab-proxy 0.25.1__py3-none-any.whl → 0.26.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of matlab-proxy might be problematic. Click here for more details.

matlab_proxy/app.py CHANGED
@@ -283,6 +283,10 @@ async def start_matlab(req):
283
283
  JSONResponse: JSONResponse object containing updated information on the state of MATLAB among other information.
284
284
  """
285
285
  state = req.app["state"]
286
+ cookie_jar = req.app["settings"]["cookie_jar"]
287
+
288
+ if cookie_jar:
289
+ cookie_jar.clear()
286
290
 
287
291
  # Start MATLAB
288
292
  await state.start_matlab(restart_matlab=True)
@@ -349,7 +353,7 @@ async def set_licensing_info(req):
349
353
  raise Exception(
350
354
  'License type must be "NLM" or "MHLM" or "ExistingLicense"!'
351
355
  )
352
- except Exception as e:
356
+ except Exception:
353
357
  raise web.HTTPBadRequest(text="Error with licensing!")
354
358
 
355
359
  # This is true for a user who has only one license associated with their account
@@ -495,9 +499,13 @@ def make_static_route_table(app):
495
499
  """
496
500
  import importlib_resources
497
501
 
498
- from matlab_proxy import gui
499
- from matlab_proxy.gui import static
500
- from matlab_proxy.gui.static import css, js, media
502
+ from matlab_proxy import gui # noqa: F401
503
+ from matlab_proxy.gui import static # noqa: F401
504
+ from matlab_proxy.gui.static import (
505
+ css, # noqa: F401
506
+ js, # noqa: F401
507
+ media, # noqa: F401
508
+ )
501
509
 
502
510
  base_url = app["settings"]["base_url"]
503
511
 
@@ -557,6 +565,9 @@ async def matlab_view(req):
557
565
  matlab_protocol = req.app["settings"]["matlab_protocol"]
558
566
  mwapikey = req.app["settings"]["mwapikey"]
559
567
  matlab_base_url = f"{matlab_protocol}://127.0.0.1:{matlab_port}"
568
+ cookie_jar = req.app["settings"]["cookie_jar"]
569
+
570
+ cookies_from_jar = cookie_jar.get_dict() if cookie_jar else None
560
571
 
561
572
  # If we are trying to send request to matlab while the matlab_port is still not assigned
562
573
  # by embedded connector, return service not available and log a message
@@ -575,17 +586,23 @@ async def matlab_view(req):
575
586
  and reqH.get(UPGRADE, "").lower() == "websocket"
576
587
  and req.method == "GET"
577
588
  ):
578
- ws_server = web.WebSocketResponse()
589
+ ws_server = web.WebSocketResponse(
590
+ max_msg_size=constants.MAX_WEBSOCKET_MESSAGE_SIZE_IN_MB, compress=True
591
+ )
579
592
  await ws_server.prepare(req)
580
593
 
581
594
  async with aiohttp.ClientSession(
595
+ cookies=(
596
+ cookies_from_jar if cookie_jar else req.cookies
597
+ ), # If cookie jar is not provided, use the cookies from the incoming request
582
598
  trust_env=True,
583
- cookies=req.cookies,
584
599
  connector=aiohttp.TCPConnector(ssl=False),
585
600
  ) as client_session:
586
601
  try:
587
602
  async with client_session.ws_connect(
588
603
  matlab_base_url + req.path_qs,
604
+ max_msg_size=constants.MAX_WEBSOCKET_MESSAGE_SIZE_IN_MB, # max websocket message size from MATLAB to browser
605
+ compress=12, # enable websocket messages compression
589
606
  ) as ws_client:
590
607
 
591
608
  async def wsforward(ws_from, ws_to):
@@ -617,16 +634,28 @@ async def matlab_view(req):
617
634
  await ws_to.close(
618
635
  code=ws_to.close_code, message=msg.extra
619
636
  )
637
+ elif mt == aiohttp.WSMsgType.ERROR:
638
+ logger.error(f"WebSocket error received: {msg}")
639
+ if "exceeds limit" in str(msg.data):
640
+ logger.error(
641
+ f"Message too large: {msg.data}. Please refresh browser tab to reconnect."
642
+ )
643
+ break
620
644
  else:
621
645
  raise ValueError(f"Unexpected message type: {msg}")
622
646
 
623
647
  await asyncio.wait(
624
648
  [
625
- asyncio.create_task(wsforward(ws_server, ws_client)),
626
- asyncio.create_task(wsforward(ws_client, ws_server)),
649
+ asyncio.create_task(
650
+ wsforward(ws_server, ws_client)
651
+ ), # browser to MATLAB
652
+ asyncio.create_task(
653
+ wsforward(ws_client, ws_server)
654
+ ), # MATLAB to browser
627
655
  ],
628
656
  return_when=asyncio.FIRST_COMPLETED,
629
657
  )
658
+
630
659
  return ws_server
631
660
 
632
661
  except Exception as err:
@@ -666,11 +695,37 @@ async def matlab_view(req):
666
695
  allow_redirects=False,
667
696
  data=req_body,
668
697
  params=None,
698
+ cookies=cookies_from_jar, # Pass cookies from cookie_jar for HTTP requests to MATLAB. This value will
699
+ # be none if cookie jar is not enabled
669
700
  ) as res:
670
701
  headers = res.headers.copy()
671
702
  body = await res.read()
672
- headers.update(req.app["settings"]["mwi_custom_http_headers"])
673
- return web.Response(headers=headers, status=res.status, body=body)
703
+
704
+ response = web.Response(
705
+ status=res.status, headers=headers, body=body
706
+ )
707
+
708
+ # Purpose of the cookie-jar in matlab-proxy is to:
709
+ # 1) Update the cookies within it when the Embedded Connector sends back Set-Cookie headers in the response.
710
+ # 2) Read these cookies from the cookie jar and insert them into subsequent requests to the Embedded Connector.
711
+
712
+ # Due to matlab-proxy's PING requests to EC, the number cookies present in the cookie-jar and their
713
+ # value will be more than the ones present on the browser side.
714
+ # Example: The JSESSIONID cookie will be present in the cookie-jar but not on the browser side.
715
+ # This inconsistency of cookies between the browser and matlab-proxy's cookie-jar is expected and okay
716
+ # as these cookies are HttpOnly cookies.
717
+
718
+ # Incase the Embedded Connector sends cookies which are not HttpOnly, then additional logic needs to be written
719
+ # to update the response with cookies from the cookie jar before it is forwarded to the browser.
720
+ if cookie_jar:
721
+ # Update the cookies in the cookie jar with the Set-Cookie headers in the response.
722
+ cookie_jar.update_from_response_headers(headers)
723
+
724
+ response.headers.update(
725
+ req.app["settings"]["mwi_custom_http_headers"]
726
+ )
727
+
728
+ return response
674
729
 
675
730
  # Handles any pending HTTP requests from the browser when the MATLAB process is terminated before responding to them.
676
731
  except (
@@ -852,7 +907,7 @@ def configure_and_start(app):
852
907
 
853
908
  logger.debug("Starting MATLAB proxy app")
854
909
  logger.debug(
855
- f' with base_url: {app["settings"]["base_url"]} and app_port:{app["settings"]["app_port"]}.'
910
+ f" with base_url: {app['settings']['base_url']} and app_port:{app['settings']['app_port']}."
856
911
  )
857
912
 
858
913
  app["state"].create_server_info_file()
@@ -987,7 +1042,6 @@ def print_version_and_exit():
987
1042
 
988
1043
  def main():
989
1044
  """Starting point of the integration. Creates the web app and runs indefinitely."""
990
-
991
1045
  if util.parse_cli_args()["version"]:
992
1046
  print_version_and_exit()
993
1047
 
matlab_proxy/constants.py CHANGED
@@ -6,6 +6,7 @@ from typing import Final, List
6
6
  CONNECTOR_SECUREPORT_FILENAME: Final[str] = "connector.securePort"
7
7
  VERSION_INFO_FILE_NAME: Final[str] = "VersionInfo.xml"
8
8
  MAX_HTTP_REQUEST_SIZE: Final[int] = 500_000_000 # 500MB
9
+ MAX_WEBSOCKET_MESSAGE_SIZE_IN_MB: Final[int] = 500_000_000 # 500MB
9
10
  MATLAB_LOGS_FILE_NAME: Final[str] = "matlab_logs.txt"
10
11
  USER_CODE_OUTPUT_FILE_NAME: Final[str] = "startup_code_output.txt"
11
12
 
matlab_proxy/settings.py CHANGED
@@ -19,6 +19,7 @@ import matlab_proxy
19
19
  from matlab_proxy import constants
20
20
  from matlab_proxy.constants import MWI_AUTH_TOKEN_NAME_FOR_HTTP
21
21
  from matlab_proxy.util import mwi, system
22
+ from matlab_proxy.util.cookie_jar import HttpOnlyCookieJar
22
23
  from matlab_proxy.util.mwi import environment_variables as mwi_env
23
24
  from matlab_proxy.util.mwi import token_auth
24
25
  from matlab_proxy.util.mwi.exceptions import (
@@ -159,7 +160,7 @@ def get_mwi_config_folder(dev=False):
159
160
  config_folder_path = config_folder_path / "hosts" / hostname
160
161
 
161
162
  logger.debug(
162
- f"{'Hostname could not be determined. ' if not hostname else '' }Using the folder: {config_folder_path} for storing all matlab-proxy related session information"
163
+ f"{'Hostname could not be determined. ' if not hostname else ''}Using the folder: {config_folder_path} for storing all matlab-proxy related session information"
163
164
  )
164
165
 
165
166
  return config_folder_path
@@ -220,6 +221,7 @@ def get_dev_settings(config):
220
221
  "is_xvfb_available": False,
221
222
  "is_windowmanager_available": False,
222
223
  "mwi_idle_timeout": None,
224
+ "cookie_jar": _get_cookie_jar(),
223
225
  }
224
226
 
225
227
 
@@ -321,6 +323,8 @@ def get_server_settings(config_name):
321
323
  else f"{short_desc} - MATLAB Integration"
322
324
  )
323
325
 
326
+ cookie_jar = _get_cookie_jar()
327
+
324
328
  return {
325
329
  "create_xvfb_cmd": create_xvfb_cmd,
326
330
  "base_url": mwi.validators.validate_base_url(
@@ -359,6 +363,7 @@ def get_server_settings(config_name):
359
363
  "mwi_idle_timeout": mwi.validators.validate_idle_timeout(
360
364
  os.getenv(mwi_env.get_env_name_shutdown_on_idle_timeout())
361
365
  ),
366
+ "cookie_jar": cookie_jar,
362
367
  }
363
368
 
364
369
 
@@ -700,3 +705,19 @@ def _get_matlab_cmd(matlab_executable_path, code_to_execute, nlm_conn_str):
700
705
  "-r",
701
706
  code_to_execute,
702
707
  ]
708
+
709
+
710
+ def _get_cookie_jar():
711
+ """Returns an instance of HttpOnly cookie jar if MWI_USE_COOKIE_CACHE environment variable is set to True
712
+
713
+ Returns:
714
+ HttpOnlyCookieJar: An instance of HttpOnly cookie jar if MWI_USE_COOKIE_CACHE environment variable is set to True, otherwise None.
715
+ """
716
+ cookie_jar = None
717
+ if mwi_env.Experimental.should_use_cookie_cache():
718
+ logger.info(
719
+ f"Environment variable {mwi_env.Experimental.get_env_name_use_cookie_cache()} is set. matlab-proxy server will cache cookies from MATLAB"
720
+ )
721
+ cookie_jar = HttpOnlyCookieJar()
722
+
723
+ return cookie_jar
@@ -0,0 +1,72 @@
1
+ # Copyright 2025 The MathWorks, Inc.
2
+
3
+ from http.cookies import Morsel, SimpleCookie
4
+ from typing import Dict
5
+
6
+ from matlab_proxy.util import mwi
7
+
8
+ logger = mwi.logger.get()
9
+
10
+
11
+ # For more information about HttpOnly attribute
12
+ # of a cookie, check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Set-Cookie#httponly
13
+ class HttpOnlyCookieJar:
14
+ """
15
+ A lightweight, HttpOnly, in-memory cookie store.
16
+
17
+ Its sole responsibility is to parse and store 'Set-Cookie' headers as Morsel objects and
18
+ store them in the cookie-jar only if they are marked as HttpOnly.
19
+ """
20
+
21
+ def __init__(self):
22
+ self._cookie_jar: Dict[str, Morsel] = {}
23
+ logger.debug("Cookie Jar Initialized")
24
+
25
+ def _get_cookie_name(self, cookie: SimpleCookie) -> str:
26
+ """
27
+ Returns the name of the cookie.
28
+ """
29
+ return list(cookie.keys())[0]
30
+
31
+ def update_from_response_headers(self, headers) -> None:
32
+ """
33
+ Parses 'Set-Cookie' headers from a response and stores the resulting
34
+ cookie objects (Morsels) only if they are HttpOnly cookies.
35
+ """
36
+ for set_cookie_val in headers.getall("Set-Cookie", []):
37
+ cookie = SimpleCookie()
38
+ cookie.load(set_cookie_val)
39
+ cookie_name = self._get_cookie_name(cookie)
40
+ morsel = cookie[cookie_name]
41
+
42
+ if morsel["httponly"]:
43
+ self._cookie_jar[cookie_name] = morsel
44
+ logger.debug(
45
+ f"Stored cookie object for key '{cookie_name}'. Value: '{cookie[cookie_name]}'"
46
+ )
47
+
48
+ else:
49
+ logger.warning(
50
+ f"Cookie {cookie_name} is not a HttpOnly cookie. Skipping it."
51
+ )
52
+
53
+ def get_cookies(self):
54
+ """
55
+ Returns a copy of the internal dictionary of stored cookie Morsels.
56
+ """
57
+ return list(self._cookie_jar.values())
58
+
59
+ def get_dict(self) -> Dict[str, str]:
60
+ """
61
+ Returns the stored cookies as a simple dictionary of name-to-value strings,
62
+ which is compatible with aiohttp's 'LooseCookies' type.
63
+ """
64
+ loose_cookies = {
65
+ name: morsel.value for name, morsel in self._cookie_jar.items()
66
+ }
67
+ return loose_cookies
68
+
69
+ def clear(self):
70
+ """Clears all stored cookies."""
71
+ logger.info("Cookie Jar Cleared")
72
+ self._cookie_jar.clear()
@@ -198,3 +198,13 @@ class Experimental:
198
198
  def is_matlab_startup_profiling_enabled():
199
199
  """Returns true if the startup profiling is enabled."""
200
200
  return _is_env_set_to_true(Experimental.get_env_name_profile_matlab_startup())
201
+
202
+ @staticmethod
203
+ def get_env_name_use_cookie_cache():
204
+ """Returns the environment variable name used to enable cookie jar support for matlab-proxy"""
205
+ return "MWI_USE_COOKIE_CACHE"
206
+
207
+ @staticmethod
208
+ def should_use_cookie_cache():
209
+ """Returns true if the cookie jar support is enabled."""
210
+ return _is_env_set_to_true(Experimental.get_env_name_use_cookie_cache())
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: matlab-proxy
3
- Version: 0.25.1
3
+ Version: 0.26.0
4
4
  Summary: Python® package enables you to launch MATLAB® and access it from a web browser.
5
5
  Home-page: https://github.com/mathworks/matlab-proxy/
6
6
  Author: The MathWorks, Inc.
@@ -27,6 +27,7 @@ Requires-Dist: requests
27
27
  Provides-Extra: dev
28
28
  Requires-Dist: aiohttp-devtools; extra == "dev"
29
29
  Requires-Dist: black; extra == "dev"
30
+ Requires-Dist: ruff; extra == "dev"
30
31
  Requires-Dist: pytest; extra == "dev"
31
32
  Requires-Dist: pytest-env; extra == "dev"
32
33
  Requires-Dist: pytest-cov; extra == "dev"
@@ -36,6 +37,7 @@ Requires-Dist: pytest-aiohttp; extra == "dev"
36
37
  Requires-Dist: psutil; extra == "dev"
37
38
  Requires-Dist: urllib3; extra == "dev"
38
39
  Requires-Dist: pytest-playwright; extra == "dev"
40
+ Requires-Dist: pytest-asyncio==0.24.0; extra == "dev"
39
41
 
40
42
  # MATLAB Proxy
41
43
  [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/mathworks/matlab-proxy/run-tests.yml?branch=main&logo=github)](https://github.com/mathworks/matlab-proxy/actions)   [![PyPI badge](https://img.shields.io/pypi/v/matlab-proxy.svg?logo=pypi)](https://pypi.python.org/pypi/matlab-proxy)   [![codecov](https://codecov.io/gh/mathworks/matlab-proxy/branch/main/graph/badge.svg?token=ZW3SESKCSS)](https://codecov.io/gh/mathworks/matlab-proxy)   [![Downloads](https://static.pepy.tech/personalized-badge/matlab-proxy?period=month&units=international_system&left_color=grey&right_color=blue&left_text=PyPI%20downloads/month)](https://pepy.tech/project/matlab-proxy)
@@ -1,10 +1,10 @@
1
1
  matlab_proxy/__init__.py,sha256=6cwi8buKCMtw9OeWaOYUHEoqwl5MyJ_s6GxgNuqPuNg,1673
2
- matlab_proxy/app.py,sha256=-lqRLDnDVdz01tPTzE58mRfxxqLKSUptXsI746a6i_k,34566
2
+ matlab_proxy/app.py,sha256=xMZdQinwZi7C9-Y0oVCHce-QVlz9tzzLgBsaPDuvy1s,37575
3
3
  matlab_proxy/app_state.py,sha256=jiPSjLZt4UHRElGaYMHf2o6kJXhliwER61mQZeezX0o,73407
4
- matlab_proxy/constants.py,sha256=So0UJC1QGvP4-nJWhau-xOlzBEdDpdExynzzbvEhtqk,1189
4
+ matlab_proxy/constants.py,sha256=gYpS3mls1i3cO4eExbqQO-z_h8QIWTkM9h2S_EAMWSU,1257
5
5
  matlab_proxy/default_configuration.py,sha256=tBHaEq_bYsX2uC9pPA9mi_8M6o94ij-rxq8mbvcYpFc,1874
6
6
  matlab_proxy/devel.py,sha256=nR6XPVBUEdQ-RZGtYvX1YHTp8gj9cuw5Hp8ahasMBc8,14310
7
- matlab_proxy/settings.py,sha256=31WrxQjqJWpvwU_4dehmkadaj8Vvn-8p8SZljFQDd8s,28540
7
+ matlab_proxy/settings.py,sha256=E1o14QnQln10BR15XKiZiXSDezlchAdfT6oA12PJ11Q,29327
8
8
  matlab_proxy/gui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  matlab_proxy/gui/favicon.ico,sha256=7w7Ki1uQP2Rgwc64dOV4-NrTu97I3WsZw8OvRSoY1A0,130876
10
10
  matlab_proxy/gui/index.html,sha256=RxJRnpMXIL8_PYz_PkzbgK_cnXR9IWnYJ4XmwJGKfwY,720
@@ -40,6 +40,7 @@ matlab_proxy/icons/matlab.svg,sha256=xh5uYebQd8I-ISvenjU9A-PkClzW_lU9wvm3doXOFKM
40
40
  matlab_proxy/matlab/evaluateUserMatlabCode.m,sha256=R8w6nPdGtadR4UUFJaspcrGQL7cJwUItdrfc531w3bM,2420
41
41
  matlab_proxy/matlab/startup.m,sha256=UcA4i2lAMytwBsO783uPIQoP5Pzw1R0xrUywbBBtTjw,533
42
42
  matlab_proxy/util/__init__.py,sha256=JkVIsTOae5giDK0cQ7jcxQSHa8zo1umdq-1C0grDZwk,11712
43
+ matlab_proxy/util/cookie_jar.py,sha256=GceKyB53lTX5r2wp9myvf0JDWDfvSamvjb4zmjkoOtY,2401
43
44
  matlab_proxy/util/event_loop.py,sha256=sX_0tKlirCY5ImLxkss_XO4Ksj65u6JHtwMj25oGL94,1816
44
45
  matlab_proxy/util/list_servers.py,sha256=M93coVZjyQCdIvCCxsNOU_XDWNjBSysOJ5tWXaTjP8Y,1369
45
46
  matlab_proxy/util/mw.py,sha256=dLGSdfcTZiwKR1MMZA-39o-8na13IEPZOGBqcaHmKVI,11086
@@ -48,7 +49,7 @@ matlab_proxy/util/windows.py,sha256=_5gl2IyHIfw8-D3_G5uHkycZVGGFVXtjkd6_aP3g2Ts,
48
49
  matlab_proxy/util/mwi/__init__.py,sha256=zI-X1lafr8H3j17PyA0oSZ0q5nINfK-WDA7VmJKmSAQ,158
49
50
  matlab_proxy/util/mwi/custom_http_headers.py,sha256=kfDjSnEXEVzoF2pZuEn76LKayeD2WKoQEDu2Y9EMOAo,7154
50
51
  matlab_proxy/util/mwi/download.py,sha256=-GJj3yOsL4vF_9baqRXkgBI-vu_OwjZMQVkJXFS8GMc,4965
51
- matlab_proxy/util/mwi/environment_variables.py,sha256=ffKEm56nt18CKYLaTihfAyqhzgYRdtNfHSu3e1Fw1yg,6568
52
+ matlab_proxy/util/mwi/environment_variables.py,sha256=GVGyf79zWek8j5RxaBQQBcEtBzh2ecCVYBKamRscXZs,6969
52
53
  matlab_proxy/util/mwi/exceptions.py,sha256=8o4PZmira_ZonnOROzu8ERIiSn9y-456JO89gqjCags,5446
53
54
  matlab_proxy/util/mwi/logger.py,sha256=GoisSphy3Jyi5-6-X0WRl1YkdrKx2xzjSxBN_w3oTU8,3802
54
55
  matlab_proxy/util/mwi/token_auth.py,sha256=UbIWqo7qADaZdijFvorLYsZbxzaB8TycGP8nk305ru0,9997
@@ -58,19 +59,20 @@ matlab_proxy/util/mwi/embedded_connector/helpers.py,sha256=kpIgJN0AqYLeX56UylWgB
58
59
  matlab_proxy/util/mwi/embedded_connector/request.py,sha256=RXoVvrm5fibVb2A6EZnkMWwAQkYX3J5kqDTGQDZo9p0,4316
59
60
  matlab_proxy_manager/__init__.py,sha256=CMqm2aSYUWo5sxV3vyqWudrQU31muouSqZRDesJNJSA,178
60
61
  matlab_proxy_manager/lib/__init__.py,sha256=KfwQxxM5a1kMRtNbhz8tb7YfHp8e2d0tNLB55wYvDS8,37
61
- matlab_proxy_manager/lib/api.py,sha256=L-yPrDqaBQ-AA1ds5PndzglBO1oglGJxy-x0F1lZZj4,12640
62
+ matlab_proxy_manager/lib/api.py,sha256=rDnxA599DZI73TUBSn8JPCbmKM_kn_T_J0dw0z4Kg5M,14380
62
63
  matlab_proxy_manager/storage/__init__.py,sha256=KfwQxxM5a1kMRtNbhz8tb7YfHp8e2d0tNLB55wYvDS8,37
63
64
  matlab_proxy_manager/storage/file_repository.py,sha256=U4FAw0zFN9z7YNlaMsYZXWm5ccs3rp3bzZL-W2BNhxA,5187
64
65
  matlab_proxy_manager/storage/interface.py,sha256=pnRRD0Ku3gzbruAOM3J3NI2Kk8do3-_yRw9Pag1IqnE,1883
65
- matlab_proxy_manager/storage/server.py,sha256=8-kv3R7dJJYfOStYGjYj1nBt2Jn3o3qnn75YVAmwFSc,6010
66
+ matlab_proxy_manager/storage/server.py,sha256=DuYl9Q-gYA71WElBHcKMd1N5LW5k_Ey0PGABuLAQrgM,6150
66
67
  matlab_proxy_manager/utils/__init__.py,sha256=KfwQxxM5a1kMRtNbhz8tb7YfHp8e2d0tNLB55wYvDS8,37
67
68
  matlab_proxy_manager/utils/auth.py,sha256=60vi16eQ7LWp3I4CNv2easTjObw50irEm518fiMA5YI,2526
68
- matlab_proxy_manager/utils/constants.py,sha256=pyg-bkk6wWfmy60nvhroZDMZt__FcbZbuvU-b9m2Fkg,163
69
- matlab_proxy_manager/utils/environment_variables.py,sha256=rbDeWnyJp77Yr6btK3eXKZQ5thwiwhOGZcvDetGPOH8,1436
70
- matlab_proxy_manager/utils/helpers.py,sha256=vgbWDTGmHpI_IMEy67UMfExxmbjMskhdEadCmbbvav8,9983
71
- matlab_proxy_manager/utils/logger.py,sha256=GSRGD-yf518o-2b1BxEeJYuNiEz2eEqpl0Solqbwpb4,1869
69
+ matlab_proxy_manager/utils/constants.py,sha256=jI6g31m7xt9DFoe5Qj2Axb3lz6O_wTBvRqHz8RnUKKA,226
70
+ matlab_proxy_manager/utils/environment_variables.py,sha256=A1E4RfSR21vWlWuoFy0JrRXbNsDtmlXI2tRqJT8jzcc,1612
71
+ matlab_proxy_manager/utils/exceptions.py,sha256=t_LykVJx7A4M-G6vg43PgzK7u7zE8i1c6aMhLSpqQOQ,1217
72
+ matlab_proxy_manager/utils/helpers.py,sha256=_BH4qvJwfJYdfdv0I6dbugQjNJ_wxnUsfD5OrsPvCCM,9989
73
+ matlab_proxy_manager/utils/logger.py,sha256=HCQNjF0rHbDBvKhMBxGWs-FVH_GLTUDKIyXDqzLMAzc,1986
72
74
  matlab_proxy_manager/web/__init__.py,sha256=KfwQxxM5a1kMRtNbhz8tb7YfHp8e2d0tNLB55wYvDS8,37
73
- matlab_proxy_manager/web/app.py,sha256=a_fCQS1rDGCuQ7iE1J2oaFrKSeBUyk_9lYeuyZo-MVc,18174
75
+ matlab_proxy_manager/web/app.py,sha256=-sfeJ4ltvcT1-8m0rOZkn357XQTSSNSPIUb3fidT71Y,20643
74
76
  matlab_proxy_manager/web/monitor.py,sha256=PWkwV0kP3XHCxDRHpurPh74Zg-SgaIXnCnX2xZSW_R8,1541
75
77
  matlab_proxy_manager/web/watcher.py,sha256=89JHjBAQtOrllstaJFxqrjHwckpRmu3qfUqeqPLmH2Q,2130
76
78
  tests/integration/__init__.py,sha256=ttzJ8xKWGxOJZz56qOiWOn6sp5LGomkZMn_w4KJLRMU,42
@@ -85,14 +87,15 @@ tests/integration/utils/integration_tests_utils.py,sha256=IbJ9CedFHiz3k85FBY-8Gw
85
87
  tests/integration/utils/licensing.py,sha256=rEBjvMXO8R3mL6KnePu2lojmOsjD4GXl9frf9N0Wacs,4842
86
88
  tests/unit/__init__.py,sha256=KfwQxxM5a1kMRtNbhz8tb7YfHp8e2d0tNLB55wYvDS8,37
87
89
  tests/unit/conftest.py,sha256=FIL7bhw2-9B5OEspqt9toZ2ZlN18pOsPEFjeQmVNcSk,1916
88
- tests/unit/test_app.py,sha256=VZt64uhdhsdmZL3Pb9LGtxxgt0H18mzRZRzSyiud6nQ,40028
90
+ tests/unit/test_app.py,sha256=PhnkFIgJok5TQbwa5OEJc2-hH1YJVRGkahiZw3V60jw,43516
89
91
  tests/unit/test_app_state.py,sha256=ZhywxbZb9HCxLQjgW1QEHccaydCeGKX20YOFFjpKWYM,38047
90
92
  tests/unit/test_constants.py,sha256=2nXxTmDP8utr8krsfZ4c_Bh4_mWPcDO5uI8MXeq4Usg,158
91
93
  tests/unit/test_ddux.py,sha256=a2J2iM8j_nnfJVuMI38p5AjwrRdoMj3N88gFgS2I4hg,713
92
94
  tests/unit/test_devel.py,sha256=A-1iVhSSwmywaW65QIRcUS2Fk7nJxceCcCm7CJtNdEc,7982
93
95
  tests/unit/test_non_dev_mode.py,sha256=Jqs5W-ax6WNM9v5SeTjpmVsojjA95itPC8Lqhs2U3Oc,5533
94
- tests/unit/test_settings.py,sha256=CZDopczxa7zMC1LIpRckwnG4v2Ag4RBLqPE1TaypNYM,23271
96
+ tests/unit/test_settings.py,sha256=0vwuEw2QSNLdOaCbV8kaVlRYEGabfWBOKpzHGgpv4e0,23924
95
97
  tests/unit/util/__init__.py,sha256=GInSQBb2SoVD5LZfmSCQa9-UZJT_UP-jNfrojkgCybU,87
98
+ tests/unit/util/test_cookie_jar.py,sha256=t9UaRos-TMC-jjuFvYwwJrm5dd1UxmZAWpCPqs_wGiY,7209
96
99
  tests/unit/util/test_mw.py,sha256=hweBw3ijcdh_2QdECjAWNkmh_7P5Df728cgD51DFkT8,18571
97
100
  tests/unit/util/test_util.py,sha256=n-xSkwdqXfq550jWYsmjhGjx6L98URhWeLJLKhGekOw,7476
98
101
  tests/unit/util/mwi/__init__.py,sha256=pl5jqyCHEwZEviiL8OC-SHulb1rBecstQCFF6qVjL9Y,37
@@ -106,9 +109,9 @@ tests/unit/util/mwi/embedded_connector/test_helpers.py,sha256=vYTWNUTuDeaygo16JG
106
109
  tests/unit/util/mwi/embedded_connector/test_request.py,sha256=PR-jddnXDEiip-lD7A_QSvRwEkwo3eQ8owZlk-r9vnk,1867
107
110
  tests/utils/__init__.py,sha256=ttzJ8xKWGxOJZz56qOiWOn6sp5LGomkZMn_w4KJLRMU,42
108
111
  tests/utils/logging_util.py,sha256=VBy_NRvwau3C_CVTBjK5RMROrQimnJYHO2U0aKSZiRw,2234
109
- matlab_proxy-0.25.1.dist-info/LICENSE.md,sha256=oF0h3UdSF-rlUiMGYwi086ZHqelzz7yOOk9HFDv9ELo,2344
110
- matlab_proxy-0.25.1.dist-info/METADATA,sha256=TGXteKmTuOYE0iJL7VSG16c4522mPBGBqcpX7bRMwuU,10576
111
- matlab_proxy-0.25.1.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
112
- matlab_proxy-0.25.1.dist-info/entry_points.txt,sha256=3wztwXpt6wdGfTwscc4qHbCeWzi0E2XhyJbMDndyQKc,304
113
- matlab_proxy-0.25.1.dist-info/top_level.txt,sha256=KF-347aoRGsfHTpiSqfIPUZ95bzK5-oMIu8S_TUcu-w,40
114
- matlab_proxy-0.25.1.dist-info/RECORD,,
112
+ matlab_proxy-0.26.0.dist-info/LICENSE.md,sha256=oF0h3UdSF-rlUiMGYwi086ZHqelzz7yOOk9HFDv9ELo,2344
113
+ matlab_proxy-0.26.0.dist-info/METADATA,sha256=Ywtdmy9yOZSwbwTEe90oqr-PQvPlSgpZ3ZtgKxc4u6s,10666
114
+ matlab_proxy-0.26.0.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
115
+ matlab_proxy-0.26.0.dist-info/entry_points.txt,sha256=3wztwXpt6wdGfTwscc4qHbCeWzi0E2XhyJbMDndyQKc,304
116
+ matlab_proxy-0.26.0.dist-info/top_level.txt,sha256=KF-347aoRGsfHTpiSqfIPUZ95bzK5-oMIu8S_TUcu-w,40
117
+ matlab_proxy-0.26.0.dist-info/RECORD,,