private void doPutMedia(PutMediaRequest request,
                            PutMediaResponseHandler responseHandler,
                            List<ChannelHandler> requestHandlers) {
        request.getRequestClientOptions().appendUserAgent(USER_AGENT);
        Request<PutMediaRequest> marshalled = marshall(request);
        applyUserAgent(request, marshalled);
        signer.sign(marshalled, resolveCredentials(request));

        try {
            String host = marshalled.getEndpoint().getHost();
            int port = getPort(marshalled.getEndpoint());
            Bootstrap b = new Bootstrap()
                .group(group)
                .channel(NioSocketChannel.class)
                .remoteAddress(host, port)
                .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, connectionTimeoutInMillis)
                .handler(new PutMediaHandlerInitializer(getSslContext(marshalled.getEndpoint()),
                                                        createHandlers(responseHandler, marshalled, requestHandlers),
                         host, port));
            invoke(marshalled, b, responseHandler);
        } catch (InterruptedException e) {
            throw handleInterruptedException(e);
        }
    }
Protocol factory used by normal client. Used for marshaller and error response handler creation.
aws-java-sdk-kinesisvideo/src/main/java/com/amazonaws/services/kinesisvideo/AmazonKinesisVideoPutMediaClient.java