diff --git a/src/pcloud/api.py b/src/pcloud/api.py index 1115f37..2b1f398 100644 --- a/src/pcloud/api.py +++ b/src/pcloud/api.py @@ -133,7 +133,7 @@ def _do_request(self, method, authenticate=True, json=True, endpoint=None, **kw) params.update(kw) log.debug("Doing request to %s%s", endpoint, method) log.debug("Params: %s", params) - resp = self.session.get(endpoint + method, params=params, stream=False) + resp = self.session.get(endpoint + method, params=params) if json: result = resp.json() else: @@ -242,7 +242,7 @@ def _upload(self, method, files, **kwargs): fields = list(kwargs.items()) fields.extend(files) m = MultipartEncoder(fields=fields) - resp = self.session.post( + resp = requests.post( self.endpoint + method, data=m, headers={"Content-Type": m.content_type} ) return resp.json() diff --git a/src/pcloud/pcloudfs.py b/src/pcloud/pcloudfs.py index bca2333..835c392 100644 --- a/src/pcloud/pcloudfs.py +++ b/src/pcloud/pcloudfs.py @@ -324,8 +324,14 @@ def on_close(pcloudfile): if _mode.appending: resp = self.pcloud.file_open(path=_path, flags=flags) fd = resp.get("fd") + if fd is None: + # try a second time, if file could not be opened + resp = self.pcloud.file_open(path=_path, flags=api.O_WRITE) + fd = resp.get("fd") if fd is not None: data = self.pcloud.file_read(fd=fd, count=info.size) + if resp.get('result') != 0: + api.log.error(f'Error reading file {_path} failed with {resp}') pcloud_file.seek(0, os.SEEK_END) pcloud_file.raw.write(data) resp = self.pcloud.file_close(fd=fd) @@ -344,9 +350,14 @@ def on_close(pcloudfile): resp = self.pcloud.file_open(path=_path, flags=api.O_WRITE) fd = resp.get("fd") if fd is None: - api.log.error(f'Error opening file {_path} failed with {resp}') + # try a second time, if file could not be opened + resp = self.pcloud.file_open(path=_path, flags=api.O_WRITE) + fd = resp.get("fd") + if fd is None: + api.log.error(f'Error opening file {_path} failed with {resp}') else: - pcloud_file.raw.write(self.pcloud.file_read(fd=fd, count=info.size)) + data = self.pcloud.file_read(fd=fd, count=info.size) + pcloud_file.raw.write(data) resp = self.pcloud.file_close(fd=fd) if resp.get('result') != 0: api.log.error(f'Error closing file {_path} failed with {resp}') diff --git a/src/pcloud/tests/test_pyfs.py b/src/pcloud/tests/test_pyfs.py index f5c55bd..f95a406 100644 --- a/src/pcloud/tests/test_pyfs.py +++ b/src/pcloud/tests/test_pyfs.py @@ -1,4 +1,5 @@ import os +import time import unittest import uuid @@ -38,3 +39,7 @@ def tearDown(self): self.pcloudfs.removetree(self.testdir) except ResourceNotFound: # pragma: no coverage pass + # The pCloud API tends to get unstable under load + # Put some latency in the tests with this hack + # to stabilize tests + time.sleep(3)