/** * Calculates and sets {@link Payload#setContentMD5} on the payload. * * <p>note that this will rebuffer in memory if the payload is not repeatable. * * @param payload payload to calculate * @return new Payload with md5 set. * @throws IOException */ public static Payload calculateMD5(Payload payload) throws IOException { checkNotNull(payload, "payload"); if (!payload.isRepeatable()) { MutableContentMetadata oldContentMetadata = payload.getContentMetadata(); Payload oldPayload = payload; try { payload = newByteArrayPayload(toByteArray(payload)); } finally { oldPayload.release(); } oldContentMetadata.setContentLength(payload.getContentMetadata().getContentLength()); oldContentMetadata.setContentMD5(payload.getContentMetadata().getContentMD5()); payload.setContentMetadata(oldContentMetadata); } payload .getContentMetadata() .setContentMD5(asByteSource(payload.getInput()).hash(md5()).asBytes()); return payload; }