rbtools.api.request¶
Support for forming requests to a Review Board server.
Module Attributes
A callback that attempts web-based login and returns its result. |
Classes
|
A cookie policy for cookie storage and retrieval. |
|
A high-level HTTP request. |
|
Handler that presets the use of HTTP Basic Auth. |
|
Connection class for HTTPS connections. |
|
Request/response handler for HTTPS connections. |
|
A request which contains a method attribute. |
|
Custom Basic Auth handler that doesn't retry excessively. |
Processes HTTP error codes. |
|
|
Adds HTTP authentication support for URLs. |
|
Represents a Review Board server we are communicating with. |
|
Handler for authenticating through web-based login. |
- class rbtools.api.request.CookiePolicy(*, config: RBToolsConfig, **kwargs)[source]¶
Bases:
DefaultCookiePolicyA cookie policy for cookie storage and retrieval.
By default, this uses the default cookie policy imposed by Python, which is very lax with domain lookup. If there’s a cookie for
subdomain.example.comand an identical cookie forexample.com, both cookies will be returned when accessingsubdomain.example.com.Strict cookie behavior can be enabled by setting
COOKIES_STRICT_DOMAIN_MATCH = Truein.reviewboardrc.Added in version 5.1.
- __firstlineno__ = 1080¶
- __init__(*, config: RBToolsConfig, **kwargs) None[source]¶
Initialize the cookie policy.
- Parameters:
config (
rbtools.config.config.RBToolsConfig) – The loaded RBTools configuration.**kwargs (
dict) – Keyword arguments for the parent constructor.
- __static_attributes__ = ('config',)¶
- config: RBToolsConfig¶
The loaded RBTools configuration.
- domain_return_ok(domain: str, request: Request) bool[source]¶
Return whether a domain for a stored cookie should be used.
This will check if a stored cookie is considered valid for an HTTP request to a server based on a domain check. The behavior depends on the
COOKIES_STRICT_DOMAIN_MATCHsetting.- Parameters:
domain (
str) – The domain of the stored cookie.request (
urllib.request.Request) – The HTTP request to be sent to the server.
- Returns:
Trueif the cookie’s domain is a match and should be a candidate for the request.Falseif it should not be included.- Return type:
- class rbtools.api.request.HttpRequest(url: str, method: str = 'GET', query_args: Mapping[str, QueryArgs] | None = None, headers: Mapping[str, str] | None = None)[source]¶
Bases:
objectA high-level HTTP request.
This is used to construct an HTTP request to a Review Board server. It takes in the URL, HTTP method, any query arguments and headers needed to perform the request, and provides methods for building a request payload compatible with the Review Board API.
Instances are intentionally generic and not tied to
urllib2, providing API stability and a path toward eventually interfacing with other HTTP backends.- __firstlineno__ = 144¶
- __init__(url: str, method: str = 'GET', query_args: Mapping[str, QueryArgs] | None = None, headers: Mapping[str, str] | None = None) None[source]¶
Initialize the HTTP request.
- __static_attributes__ = ('_fields', '_files', '_method', 'headers', 'url')¶
- add_field(name: bytes | str, value: bytes | str) None[source]¶
Add a form-data field for the request.
Changed in version 6.0: Values of types other than bytes or str will now raise a
ValueError.Changed in version 4.0: Values of types other than bytes or str are now deprecated, and will be removed in 6.0.
- add_file(name: bytes | str, filename: bytes | str, content: bytes | str, mimetype: bytes | str | None = None) None[source]¶
Add an uploaded file for the request.
- encode_multipart_formdata() tuple[str | None, bytes | None][source]¶
Encode the request into a multi-part form-data payload.
- encode_url_key(key: str) str[source]¶
Encode the given key for inclusion in a URL.
- Parameters:
key (
str) – The key that is being encoded.- Raises:
ValueError – The given key was neither a unicode string or byte string.
- Returns:
The key encoded as a unicode string.
- Return type:
- class rbtools.api.request.PresetHTTPAuthHandler(url: str, password_mgr: ReviewBoardHTTPPasswordMgr)[source]¶
Bases:
BaseHandlerHandler that presets the use of HTTP Basic Auth.
- __annotations_cache__ = {}¶
- __firstlineno__ = 801¶
- __init__(url: str, password_mgr: ReviewBoardHTTPPasswordMgr) None[source]¶
Initialize the handler.
- Parameters:
url (
str) – The URL of the Review Board server.password_mgr (
ReviewBoardHTTPPasswordMgr) – The password manager to use for requests.
- __static_attributes__ = ('password_mgr', 'url', 'used')¶
- http_request(request: Request) Request[source]¶
Modify an HTTP request with authentication information.
- Parameters:
request (
rbtools.api.request.Request) – The HTTP request to make.- Returns:
The HTTP request, with authentication headers added.
- Return type:
- https_request(request: Request) Request[source]¶
Modify an HTTP request with authentication information.
- Parameters:
request (
rbtools.api.request.Request) – The HTTP request to make.- Returns:
The HTTP request, with authentication headers added.
- Return type:
- reset(*, username: str | None = None, password: str | None = None, api_token: str | None = None) None[source]¶
Reset the stored authentication credentials.
Changed in version 5.0: Added an optional
api_tokenparameter and made theusernameandpasswordparameters optional to allow authentication with either a username and password or API token.- Parameters:
username (
str, optional) – The username to use for authentication. IfNoneand no API token is provided, this will log out the user.password (
str, optional) – The password to use for authentication. IfNoneand no API token is provided, this will log out the user.api_token (
str, optional) – The API token to use for authentication. IfNoneand no username and password are provided, this will log out the user.
- class rbtools.api.request.RBToolsHTTPSConnection(host, port=None, *, timeout=<object object>, source_address=None, context=None, blocksize=8192)[source]¶
Bases:
HTTPSConnectionConnection class for HTTPS connections.
This is a specialization of the default HTTPS connection class that provides custom error handling for SSL errors.
Added in version 4.1.
- __annotations_cache__ = {}¶
- __firstlineno__ = 429¶
- __static_attributes__ = ()¶
- connect(*args, **kwargs) Any[source]¶
Connect to the server.
This will catch SSL errors and wrap them with our own error classes.
- Parameters:
- Returns:
The result from the parent method.
- Return type:
- Raises:
rbtools.api.errors.ServerInterfaceSSLError – An SSL error occurred during communication. Details will be in the error message.
- class rbtools.api.request.RBToolsHTTPSHandler(debuglevel=None, context=None, check_hostname=None)[source]¶
Bases:
HTTPSHandlerRequest/response handler for HTTPS connections.
This wraps the default HTTPS handler, passing in a specialized HTTPS connection class used to generate more useful SSL-related errors.
Added in version 4.1.
- __annotations_cache__ = {}¶
- __firstlineno__ = 475¶
- __static_attributes__ = ()¶
- do_open(http_class: HTTPSConnection, *args, **kwargs) HTTPResponse[source]¶
Open a connection to the server.
- Parameters:
- Returns:
The resulting HTTP response.
- Return type:
- Raises:
rbtools.api.errors.ServerInterfaceSSLError – An SSL error occurred during communication. Details will be in the error message.
- class rbtools.api.request.Request(url: str, body: bytes | None = b'', headers: dict[str, str] | None = None, method: str = 'PUT')[source]¶
Bases:
RequestA request which contains a method attribute.
- __firstlineno__ = 520¶
- __init__(url: str, body: bytes | None = b'', headers: dict[str, str] | None = None, method: str = 'PUT') None[source]¶
Initialize the request.
- __static_attributes__ = ('method',)¶
- class rbtools.api.request.ReviewBoardHTTPBasicAuthHandler(*args, **kwargs)[source]¶
Bases:
HTTPBasicAuthHandlerCustom Basic Auth handler that doesn’t retry excessively.
urllib’s HTTPBasicAuthHandler retries over and over, which is useless. This subclass only retries once to make sure we’ve attempted with a valid username and password. It will then fail so we can use our own retry handler.
This also supports two-factor auth, for Review Board servers that support it. When requested by the server, the client will be prompted for a one-time password token, which would be sent generally through a mobile device. In this case, the client will prompt up to a set number of times until a valid token is entered.
- __firstlineno__ = 895¶
- __static_attributes__ = ('_last_otp_token', '_otp_token_attempts', '_otp_token_method', '_tried_login')¶
- http_error_auth_reqed(authreq: str, host: str, req: Request, headers: HTTPMessage) None[source]¶
Handle an HTTP 401 Unauthorized from an API request.
This will start by checking whether a two-factor authentication token is required by the server, and which method it will be sent by (SMS or token generator application), before handing back to the parent class, which will then call into our custom
retry_http_basic_auth().- Parameters:
authreq (
str) – The authentication request type.host (
str) – The URL being accessed.req (
rbtools.api.request.Request) – The API request being made.headers (
http.client.HTTPMessage) – The headers sent in the Unauthorized error response.
- Returns:
If attempting another request, this will be the HTTP response from that request. This will be
Noneif not making another request.- Return type:
- Raises:
urllib2.URLError – The HTTP request resulted in an error. If this is an HTTP 401 Unauthorized, it may be handled by this class again.
- passwd: ReviewBoardHTTPPasswordMgr¶
- retry_http_basic_auth(host: str, request: Request, realm: str) HTTPResponse | None[source]¶
Attempt another HTTP Basic Auth request.
This will determine if another request should be made (based on previous attempts and 2FA requirements. Based on this, it may make another attempt.
- Parameters:
host (
str) – The URL being accessed.request (
rbtools.api.request.Request) – The API request being made.realm (
str) – The Basic Auth realm, which will be used to look up any stored passwords.
- Returns:
If attempting another request, this will be the HTTP response from that request. This will be
Noneif not making another request.- Return type:
- Raises:
urllib2.URLError – The HTTP request resulted in an error. If this is an HTTP 401 Unauthorized, it may be handled by this class again.
- class rbtools.api.request.ReviewBoardHTTPErrorProcessor[source]¶
Bases:
HTTPErrorProcessorProcesses HTTP error codes.
Python’s built-in error processing understands 2XX responses as successful, but processes 3XX as an error. This handler ensures that all valid responses from the API are processed as such.
- __annotations_cache__ = {}¶
- __firstlineno__ = 563¶
- __static_attributes__ = ()¶
- class rbtools.api.request.ReviewBoardHTTPPasswordMgr(reviewboard_url: str, rb_user: str | None = None, rb_pass: str | None = None, api_token: str | None = None, auth_callback: Callable[[...], tuple[str, str]] | None = None, otp_token_callback: Callable[[str, str], str] | None = None, web_login_callback: Callable[[], bool] | None = None)[source]¶
Bases:
HTTPPasswordMgrAdds HTTP authentication support for URLs.
- __annotations_cache__ = {}¶
- __firstlineno__ = 583¶
- __init__(reviewboard_url: str, rb_user: str | None = None, rb_pass: str | None = None, api_token: str | None = None, auth_callback: Callable[[...], tuple[str, str]] | None = None, otp_token_callback: Callable[[str, str], str] | None = None, web_login_callback: Callable[[], bool] | None = None) None[source]¶
Initialize the password manager.
Changed in version 6.0: Added the
web_login_callbackargument.- Parameters:
reviewboard_url (
str) – The URL of the Review Board server.rb_user (
str, optional) – The username to authenticate with.rb_pass (
str, optional) – The password to authenticate with.api_token (
str, optional) – The API token to authenticate with. If present, this takes priority over the username and password.auth_callback (
callable, optional) – A callback to prompt the user for their username and password.otp_token_callback (
callable, optional) – A callback to prompt the user for their two-factor authentication code.web_login_callback (
callable, optional) –A callback to attempt authentication through web-based login.
Added in version 6.0.
- __static_attributes__ = ('api_token', 'auth_callback', 'otp_token_callback', 'rb_pass', 'rb_url', 'rb_user', 'web_login_callback')¶
- attempt_web_login() bool[source]¶
Attempt authenticating using web-based login.
Added in version 6.0.
- Returns:
Whether the web-based login successfully authenticated.
- Return type:
- class rbtools.api.request.ReviewBoardServer(url: str, cookie_file: str | None = None, username: str | None = None, password: str | None = None, api_token: str | None = None, agent: str | None = None, session: str | None = None, disable_proxy: bool = False, auth_callback: AuthCallback | None = None, otp_token_callback: OTPCallback | None = None, verify_ssl: bool = True, save_cookies: bool = True, ext_auth_cookies: str | None = None, ca_certs: str | None = None, client_key: str | None = None, client_cert: str | None = None, proxy_authorization: str | None = None, *, config: RBToolsConfig | None = None, web_login_callback: WebLoginCallback | None = None)[source]¶
Bases:
objectRepresents a Review Board server we are communicating with.
Provides methods for executing HTTP requests on a Review Board server’s Web API.
The
auth_callbackparameter can be used to specify a callable which will be called when authentication fails. This callable will be passed the realm, and url of the Review Board server and should return a 2-tuple of username, password. The user can be prompted for their credentials using this mechanism.- __firstlineno__ = 1227¶
- __init__(url: str, cookie_file: str | None = None, username: str | None = None, password: str | None = None, api_token: str | None = None, agent: str | None = None, session: str | None = None, disable_proxy: bool = False, auth_callback: AuthCallback | None = None, otp_token_callback: OTPCallback | None = None, verify_ssl: bool = True, save_cookies: bool = True, ext_auth_cookies: str | None = None, ca_certs: str | None = None, client_key: str | None = None, client_cert: str | None = None, proxy_authorization: str | None = None, *, config: RBToolsConfig | None = None, web_login_callback: WebLoginCallback | None = None) None[source]¶
Initialize the server object.
Changed in version 6.0: Added the
web_login_callbackargument.5.1: Added the
configargument.- Parameters:
url (
str) – The URL of the Review Board server.cookie_file (
str, optional) – The name of the file to store authentication cookies in.username (
str, optional) – The username to use for authentication.password (
str, optional) – The password to use for authentication.api_token (
str, optional) – An API token to use for authentication. If present, this is preferred over the username and password.agent (
str, optional) – A User-Agent string to use for the client. If not specified, the default RBTools User-Agent will be used.session (
str, optional) – Anrbsessionidstring to use for authentication.disable_proxy (
bool, optional) – Whether to disable HTTP proxies.auth_callback (
callable, optional) – A callback method to prompt the user for a username and password.otp_callback (
callable, optional) – A callback method to prompt the user for their two-factor authentication code.verify_ssl (
bool, optional) – Whether to verify SSL certificates.save_cookies (
bool, optional) – Whether to save authentication cookies.ext_auth_cookies (
str, optional) – The name of a file to load additional cookies from. These will be layered on top of any cookies loaded fromcookie_file.ca_certs (
str, optional) – The name of a file to load certificates from.client_key (
str, optional) – The key for a client certificate to load into the chain.client_cert (
str, optional) – A client certificate to load into the chain.proxy_authorization (
str, optional) – A string to use for theProxy-Authorizationheader.config (
rbtools.config.RBToolsConfig, optional) –The loaded RBTools configuration.
If not provided, the configuration will be loaded.
Added in version 5.1.
web_login_callback (
callable, optional) –A callback to attempt authentication through web-based login.
Added in version 6.0.
- __static_attributes__ = ('_cache', '_urlopen', 'agent', 'config', 'cookie_file', 'cookie_jar', 'domain', 'ext_auth_cookies', 'preset_auth_handler', 'save_cookies', 'url')¶
- config: RBToolsConfig¶
The loaded RBTools configuration.
Added in version 5.1.
- cookie_jar: CookieJar¶
The cookie jar object for managing authentication cookies.
- Type:
- enable_cache(cache_location: str | None = None, in_memory: bool = False) None[source]¶
Enable caching for all future HTTP requests.
The cache will be created at the default location if none is provided.
If the in_memory parameter is True, the cache will be created in memory instead of on disk. This overrides the cache_location parameter.
- has_session_cookie() bool[source]¶
Return whether a local session cookie exists for this server.
This checks whether the cookie jar would attach a
rbsessionidcookie to a request to the API.This does not guarantee that the session is valid server-side (the cookie may be stale), this just returns whether a local session cookie has been set for this server.
Added in version 6.0.
- Returns:
Whether a local session cookie exists for this server.
- Return type:
- login(*, username: str | None = None, password: str | None = None, api_token: str | None = None) None[source]¶
Log in to the Review Board server.
Either a username and password combination or an API token must be provided.
Changed in version 5.0: Added an optional
api_tokenparameter and made theusernameandpasswordparameters optional to allow logging in with either a username and password or API token.- Parameters:
- Raises:
ValueError – No username and password or API token was provided.
- make_request(request: HttpRequest) HTTPResponse | CachedHTTPResponse | LiveHTTPResponse | None[source]¶
Perform an http request.
- Parameters:
request (
rbtools.api.request.HttpRequest) – The request object.- Returns:
The HTTP response.
- Return type:
- class rbtools.api.request.ReviewBoardWebLoginHandler(password_mgr: ReviewBoardHTTPPasswordMgr)[source]¶
Bases:
BaseHandlerHandler for authenticating through web-based login.
This will try web-based login one time upon the first HTTP 401, and fall back onto the other auth handlers if it fails.
Added in version 6.0.
- __annotations_cache__ = {}¶
- __firstlineno__ = 725¶
- __init__(password_mgr: ReviewBoardHTTPPasswordMgr) None[source]¶
Initialize the handler.
- Parameters:
password_mgr (
ReviewBoardHTTPPasswordMgr) – The password manager to use for requests.
- __static_attributes__ = ('password_mgr', 'used')¶
- http_error_401(req: Request, fp: HTTPResponse | None, code: int, msg: str, headers: HTTPMessage) HTTPResponse | None[source]¶
Handle an HTTP 401 Unauthorized from an API request.
This will attempt to authenticate using web-based login. If successfully authenticated, the request will be retried. If the login fails, or if this handler has already been used, the request will be passed on to the next authentication handler.
Added in version 6.0.
- Parameters:
req (
rbtools.api.request.Request) – The API request being made.fp (
http.client.HTTPResponse, unused) – The file-like HTTP response object, if available.code (
int, unused) – The HTTP error code.msg (
str, unused) – The HTTP error message returned by the server.headers (
HTTPMessage, unused) – The headers sent in the Unauthorized error response.
- Returns:
The response if the request was successfully retried and completed, or
Noneto delegate to the next handler.- Return type: