code: protected <X extends AmazonWebServiceRequest> Request<X> createRequest(String bucketName, String key, X originalRequest, HttpMethodName httpMethod) {
          return createRequest(bucketName, key, originalRequest, httpMethod, endpoint);
      }
docs: Creates and initializes a new request object for the specified S3
  resource. This method is responsible for determining the right way to
  address resources. For example, bucket names that are not DNS addressable
  cannot be addressed in V2, virtual host, style, and instead must use V1,
  path style. The returned request object has the service name, endpoint
  and resource path correctly populated. Callers can take the request, add
  any additional headers or parameters, then sign and execute the request.
  
  @param bucketName
  An optional parameter indicating the name of the bucket
  containing the resource involved in the request.
  @param key
  An optional parameter indicating the key under which the
  desired resource is stored in the specified bucket.
  @param originalRequest
  The original request, as created by the user.
  @param httpMethod
  The HTTP method to use when sending the request.
  
  @return A new request object, populated with endpoint, resource path, and
  service name, ready for callers to populate any additional
  headers or parameters, and execute.