'Sign a request before it goes out over the wire.
:type operation_name: string
:param operation_name: The name of the current operation, e.g.
``ListBuckets``.
:type request: AWSRequest
:param request: The request object to be sent over the wire.
:type region_name: str
:param region_name: The region to sign the request for.
:type signing_type: str
:param signing_type: The type of signing to perform. This can be one of
three possible values:
* \'standard\'     - This should be used for most requests.
* \'presign-url\'  - This should be used when pre-signing a request.
* \'presign-post\' - This should be used when pre-signing an S3 post.
:type expires_in: int
:param expires_in: The number of seconds the presigned url is valid
for. This parameter is only valid for signing type \'presign-url\'.
:type signing_name: str
:param signing_name: The name to use for the service when signing.'

def sign(self, operation_name, request, region_name=None, signing_type='standard', expires_in=None, signing_name=None):

    if (region_name is None):
        region_name = self._region_name
    if (signing_name is None):
        signing_name = self._signing_name
    signature_version = self._choose_signer(operation_name, signing_type, request.context)
    self._event_emitter.emit('before-sign.{0}.{1}'.format(self._service_name, operation_name), request=request, signing_name=signing_name, region_name=self._region_name, signature_version=signature_version, request_signer=self)
    if (signature_version != botocore.UNSIGNED):
        kwargs = {'signing_name': signing_name, 'region_name': region_name, 'signature_version': signature_version}
        if (expires_in is not None):
            kwargs['expires'] = expires_in
        try:
            auth = self.get_auth_instance(**kwargs)
        except UnknownSignatureVersionError as e:
            if (signing_type != 'standard'):
                raise UnsupportedSignatureVersionError(signature_version=signature_version)
            else:
                raise e
        auth.add_auth(request)
