|
8 | 8 |
|
9 | 9 | import requests |
10 | 10 | import requests.utils |
11 | | -from requests_toolbelt.multipart.encoder import MultipartEncoder # type: ignore |
12 | 11 |
|
13 | 12 | import gitlab |
14 | 13 | import gitlab.config |
@@ -637,38 +636,6 @@ def _check_redirects(result: requests.Response) -> None: |
637 | 636 | ) |
638 | 637 | ) |
639 | 638 |
|
640 | | - @staticmethod |
641 | | - def _prepare_send_data( |
642 | | - files: Optional[Dict[str, Any]] = None, |
643 | | - post_data: Optional[Union[Dict[str, Any], bytes]] = None, |
644 | | - raw: bool = False, |
645 | | - ) -> Tuple[ |
646 | | - Optional[Union[Dict[str, Any], bytes]], |
647 | | - Optional[Union[Dict[str, Any], MultipartEncoder]], |
648 | | - str, |
649 | | - ]: |
650 | | - if files: |
651 | | - if post_data is None: |
652 | | - post_data = {} |
653 | | - else: |
654 | | - # booleans does not exists for data (neither for MultipartEncoder): |
655 | | - # cast to string int to avoid: 'bool' object has no attribute 'encode' |
656 | | - if TYPE_CHECKING: |
657 | | - assert isinstance(post_data, dict) |
658 | | - for k, v in post_data.items(): |
659 | | - if isinstance(v, bool): |
660 | | - post_data[k] = str(int(v)) |
661 | | - post_data["file"] = files.get("file") |
662 | | - post_data["avatar"] = files.get("avatar") |
663 | | - |
664 | | - data = MultipartEncoder(post_data) |
665 | | - return (None, data, data.content_type) |
666 | | - |
667 | | - if raw and post_data: |
668 | | - return (None, post_data, "application/octet-stream") |
669 | | - |
670 | | - return (post_data, None, "application/json") |
671 | | - |
672 | 639 | def http_request( |
673 | 640 | self, |
674 | 641 | verb: str, |
@@ -746,7 +713,9 @@ def http_request( |
746 | 713 | retry_transient_errors = self.retry_transient_errors |
747 | 714 |
|
748 | 715 | # We need to deal with json vs. data when uploading files |
749 | | - json, data, content_type = self._prepare_send_data(files, post_data, raw) |
| 716 | + json, data, content_type = self.http_backend.prepare_send_data( |
| 717 | + files, post_data, raw |
| 718 | + ) |
750 | 719 | opts["headers"]["Content-type"] = content_type |
751 | 720 |
|
752 | 721 | cur_retries = 0 |
@@ -779,46 +748,42 @@ def http_request( |
779 | 748 | if 200 <= result.status_code < 300: |
780 | 749 | return result.response |
781 | 750 |
|
782 | | - if (429 == result.response.status_code and obey_rate_limit) or ( |
783 | | - result.response.status_code |
784 | | - in gitlab.const.RETRYABLE_TRANSIENT_ERROR_CODES |
| 751 | + if (429 == result.status_code and obey_rate_limit) or ( |
| 752 | + result.status_code in gitlab.const.RETRYABLE_TRANSIENT_ERROR_CODES |
785 | 753 | and retry_transient_errors |
786 | 754 | ): |
787 | 755 | # Response headers documentation: |
788 | 756 | # https://docs.gitlab.com/ee/user/admin_area/settings/user_and_ip_rate_limits.html#response-headers |
789 | 757 | if max_retries == -1 or cur_retries < max_retries: |
790 | 758 | wait_time = 2**cur_retries * 0.1 |
791 | | - if "Retry-After" in result.response.headers: |
792 | | - wait_time = int(result.response.headers["Retry-After"]) |
793 | | - elif "RateLimit-Reset" in result.response.headers: |
794 | | - wait_time = ( |
795 | | - int(result.response.headers["RateLimit-Reset"]) |
796 | | - - time.time() |
797 | | - ) |
| 759 | + if "Retry-After" in result.headers: |
| 760 | + wait_time = int(result.headers["Retry-After"]) |
| 761 | + elif "RateLimit-Reset" in result.headers: |
| 762 | + wait_time = int(result.headers["RateLimit-Reset"]) - time.time() |
798 | 763 | cur_retries += 1 |
799 | 764 | time.sleep(wait_time) |
800 | 765 | continue |
801 | 766 |
|
802 | | - error_message = result.response.content |
| 767 | + error_message = result.content |
803 | 768 | try: |
804 | | - error_json = result.response.json() |
| 769 | + error_json = result.json() |
805 | 770 | for k in ("message", "error"): |
806 | 771 | if k in error_json: |
807 | 772 | error_message = error_json[k] |
808 | 773 | except (KeyError, ValueError, TypeError): |
809 | 774 | pass |
810 | 775 |
|
811 | | - if result.response.status_code == 401: |
| 776 | + if result.status_code == 401: |
812 | 777 | raise gitlab.exceptions.GitlabAuthenticationError( |
813 | | - response_code=result.response.status_code, |
| 778 | + response_code=result.status_code, |
814 | 779 | error_message=error_message, |
815 | | - response_body=result.response.content, |
| 780 | + response_body=result.content, |
816 | 781 | ) |
817 | 782 |
|
818 | 783 | raise gitlab.exceptions.GitlabHttpError( |
819 | | - response_code=result.response.status_code, |
| 784 | + response_code=result.status_code, |
820 | 785 | error_message=error_message, |
821 | | - response_body=result.response.content, |
| 786 | + response_body=result.content, |
822 | 787 | ) |
823 | 788 |
|
824 | 789 | def http_get( |
|
0 commit comments