public S3EncryptionClient(S3Config s3Config, ClientHandler clientHandler, EncryptionConfig encryptionConfig) { super(s3Config, clientHandler); this.encryptionConfig = encryptionConfig; // create an encode chain based on parameters CodecChain encodeChain = encryptionConfig.isCompressionEnabled() ? new CodecChain(encryptionConfig.getCompressionSpec(), encryptionConfig.getEncryptionSpec()) : new CodecChain(encryptionConfig.getEncryptionSpec()); encodeChain.setProperties(encryptionConfig.getCodecProperties()); // insert codec filter into chain before the authorization filter // as usual, Jersey makes this quite hard // first, make a list of the filters List<ClientFilter> filters = new ArrayList<ClientFilter>(); ClientHandler handler = client.getHeadHandler(); while (handler instanceof ClientFilter) { ClientFilter filter = (ClientFilter) handler; if (filter instanceof AuthorizationFilter) { // insert codec filter before checksum filter filters.add(new CodecFilter(encodeChain).withCodecProperties(encryptionConfig.getCodecProperties())); } filters.add(filter); handler = filter.getNext(); } // then re-create the filter list (must reverse the list because filters are inserted back to front) Collections.reverse(filters); client.removeAllFilters(); for (ClientFilter filter : filters) { client.addFilter(filter); } }
new EncryptionCodec().rekey(userMetadata, encryptionConfig.getCodecProperties());