docker registry api java impl

class DockerRegistryApiClient{
    
    private OkHttpClient okHttpClient;

    /**
     * 检查清单存在
     *
     * @param url url
     * @param headers headers
     * @return CallResult
     */
    public CallResult<String> headManifest(String url, Map<String, String> headers) {
        try {
            Response response = baseReq(url, HttpMethod.HEAD, null, headers);
            if (ObjectUtils.isEmpty(response)) {
                return CallResult.failure("调用DockerRegistry未知异常", StringUtils.EMPTY);
            }
            if (response.code() == 200) {
                return CallResult.success(response.header("content-type"));
            }
            return CallResult.failure(String.valueOf(response.code()), response.message(), response.body().string());
        } catch (IOException ex) {
            return CallResult.failure(String.valueOf(ex.getMessage()), ex.getMessage(), StringUtils.EMPTY);
        }
    }

    /**
     * 获取清单
     *
     * @param url url
     * @param headers headers
     * @return CallResult
     */
    public CallResult<String> getManifest(String url, Map<String, String> headers) {
        try {
            Response response = baseReq(url, HttpMethod.GET, null, headers);
            if (ObjectUtils.isEmpty(response)) {
                return CallResult.failure("调用DockerRegistry未知异常", StringUtils.EMPTY);
            }
            if (response.code() == 200) {
                return CallResult.success(response.body().string());
            }
            return CallResult.failure(String.valueOf(response.code()), response.message(),
                    new String(response.body().bytes(), StandardCharsets.UTF_8));
        } catch (IOException ex) {
            return CallResult.failure(String.valueOf(ex.getMessage()), ex.getMessage(), StringUtils.EMPTY);
        }
    }

    /**
     * 获取blob
     *
     * @param url url
     * @param headers headers
     * @return CallResult
     */
    public CallResult<byte[]> getBlob(String url, Map<String, String> headers) {
        try {
            Response response = baseReq(url, HttpMethod.GET, null, headers);
            if (ObjectUtils.isEmpty(response)) {
                return CallResult.failure("调用DockerRegistry未知异常", null);
            }
            if (response.code() == 200) {
                return CallResult.success(response.body().bytes());
            }
            return CallResult.failure(String.valueOf(response.code()), response.message(), response.body().bytes());
        } catch (IOException ex) {
            return CallResult.failure(String.valueOf(ex.getMessage()), ex.getMessage(), new byte[0]);
        }
    }

    /**
     * 检查blob存在
     *
     * @param url url
     * @param headers headers
     * @return CallResult
     */
    public CallResult<String> headBlob(String url, Map<String, String> headers) {
        try {
            Response response = baseReq(url, HttpMethod.HEAD, null, headers);
            if (ObjectUtils.isEmpty(response)) {
                return CallResult.failure("调用DockerRegistry未知异常", StringUtils.EMPTY);
            }
            if (response.code() == 200) {
                return CallResult.success();
            }
            return CallResult.failure(String.valueOf(response.code()), response.message(), response.body().string());
        } catch (IOException ex) {
            return CallResult.failure(String.valueOf(ex.getMessage()), ex.getMessage(), StringUtils.EMPTY);
        }
    }

    /**
     * 上传清单
     *
     * @param url url
     * @param body body
     * @param headers headers
     * @return CallResult
     */
    public CallResult<String> putManifest(String url, String body, Map<String, String> headers) {
        try {
            RequestBody requestBody =
                    RequestBody.create(MediaType.parse("application/vnd.docker.distribution.manifest.v2+json"), body);
            Response response = baseReq(url, HttpMethod.PUT, requestBody, headers);
            if (ObjectUtils.isEmpty(response)) {
                return CallResult.failure("调用DockerRegistry未知异常", StringUtils.EMPTY);
            }
            if (response.code() == 201) {
                return CallResult.success(response.body().string());
            }
            return CallResult.failure(String.valueOf(response.code()), response.message(), response.body().string());
        } catch (IOException ex) {
            return CallResult.failure(ex.getMessage(), StringUtils.EMPTY);
        }
    }

    /**
     * 上传blob
     *
     * @param url url
     * @param body body
     * @param headers headers
     * @return CallResult
     */
    public CallResult<String> putBlob(String url, byte[] body, Map<String, String> headers) {
        RequestBody requestBody = RequestBody.create(MediaType.parse("application/octet-stream"), body);
        if (ObjectUtils.isEmpty(headers)) {
            headers = new HashMap<>();
        }
        headers.put(HttpHeaders.CONTENT_TYPE, "application/octet-stream");
        headers.put(HttpHeaders.CONTENT_LENGTH, String.valueOf(body.length));
        try {
            Response response = baseReq(url, HttpMethod.PUT, requestBody, headers);
            if (ObjectUtils.isEmpty(response)) {
                return CallResult.failure("调用DockerRegistry未知异常", StringUtils.EMPTY);
            }
            if (response.code() == 201) {
                return CallResult.success(response.header("Location"));
            }
            return CallResult.failure(String.valueOf(response.code()), response.message(), response.body().string());
        } catch (Exception ex) {
            return CallResult.failure(ex.getMessage(), StringUtils.EMPTY);
        }
    }

    /**
     * 创建上传空间
     *
     * @param url url
     * @param body body
     * @param headers headers
     * @return CallResult
     */
    public CallResult<String> createUploads(String url, String body, Map<String, String> headers) {
        RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain"), Objects.isNull(body) ? "" : body);
        try {
            Response response = baseReq(url, HttpMethod.POST, requestBody, headers);
            if (ObjectUtils.isEmpty(response)) {
                return CallResult.failure("调用DockerRegistry未知异常", StringUtils.EMPTY);
            }
            if (response.code() == 202 || response.code() == 201) {
                return CallResult.success(response.header("Location"));
            }
            return CallResult.failure(String.valueOf(response.code()), response.message(), response.body().string());
        } catch (IOException ex) {
            return CallResult.failure(String.valueOf(ex.getMessage()), ex.getMessage(), StringUtils.EMPTY);
        }
    }

    /**
     * 删除上传空间
     *
     * @param url url
     * @param headers headers
     * @return CallResult
     */
    public CallResult<String> deleteUploads(String url, Map<String, String> headers) {
        try {
            Response response = baseReq(url, HttpMethod.DELETE, null, headers);
            if (ObjectUtils.isEmpty(response)) {
                return CallResult.failure("调用DockerRegistry未知异常", StringUtils.EMPTY);
            }
            if (response.code() == 204) {
                return CallResult.success();
            }
            return CallResult.failure(String.valueOf(response.code()), response.message(), response.body().string());
        } catch (IOException ex) {
            return CallResult.failure(String.valueOf(ex.getMessage()), ex.getMessage(), StringUtils.EMPTY);
        }
    }

    /**
     * baseReq
     *
     * @param url url
     * @param method method
     * @param body body
     * @param headers headers
     * @return Response
     * @throws IOException IOException
     */
    private Response baseReq(String url, HttpMethod method, RequestBody body, Map<String, String> headers)
            throws IOException {

        // 兼容私仓
        if (StringUtils.contains(url, "5000")) {
            url = StringUtils.replace(url, HttpConstants.HTTPS_PROTOCOL, HttpConstants.HTTP_PROTOCOL);
        }

        Request.Builder builder = new Request.Builder().url(url).method(method.name(), body);
        buildHeaders(builder, headers);
        Request request = builder.build();
        try {
            return okHttpClient.newCall(request).execute();
        } catch (NullPointerException | IllegalStateException ex) {
            return null;
        }
    }

    /**
     * buildHeaders
     *
     * @param builder builder
     * @param headers headers
     */
    private void buildHeaders(Request.Builder builder, Map<String, String> headers) {
        if (MapUtils.isEmpty(headers)) {
            return;
        }
        Iterator<Map.Entry<String, String>> iterator = headers.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, String> next = iterator.next();
            builder.header(next.getKey(), next.getValue());
        }
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值