def execute(self, *args, **kwargs): if request: size = request.args.get("size", default=25, type=int) max_page_size = current_app.config.get( "SEARCH_MAX_SEARCH_PAGE_SIZE", 500) if size > max_page_size: raise MaximumSearchPageSizeExceeded(max_size=max_page_size) with RecursionLimit( current_app.config.get("SEARCH_MAX_RECURSION_LIMIT", 5000)): return super().execute(*args, **kwargs)
def test_setting_recursion_limit(): def recursion_test(max_depth, current_level=1): level = current_level if current_level < max_depth: level = recursion_test(max_depth, current_level + 1) return level assert recursion_test(100) == 100 with pytest.raises(RecursionError): with RecursionLimit(50): recursion_test(100) assert recursion_test(100) == 100
def dumps(self, data): if isinstance(data, string_types): return data try: with RecursionLimit( current_app.config.get("SEARCH_MAX_RECURSION_LIMIT", 5000) ): dump = orjson.dumps(data, default=self.orjson_default).decode("utf-8") return dump except (ValueError, TypeError) as ex: if isinstance(ex, TypeError) and ex.args == ("Recursion limit reached",): # As currently we can only turn off recursion limit but we don't want that as # then we should handle overflow error in rust return super().dumps(data) raise SerializationError(data, ex)
def inspire_query(query_string, search): with RecursionLimit(current_app.config.get("SEARCH_MAX_RECURSION_LIMIT", 5000)): return Q(inspire_query_parser.parse_query(query_string))