/*
* Copyright 2016 Baidu, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
package com.baidubce.services.cdn;
import static com.baidubce.util.Validate.checkNotNull;
import static com.google.common.base.Preconditions.checkNotNull;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.HashSet;
import com.baidubce.AbstractBceClient;
import com.baidubce.auth.SignOptions;
import com.baidubce.BceClientConfiguration;
import com.baidubce.BceClientException;
import com.baidubce.http.Headers;
import com.baidubce.http.HttpMethodName;
import com.baidubce.http.handler.BceErrorResponseHandler;
import com.baidubce.http.handler.BceJsonResponseHandler;
import com.baidubce.http.handler.BceMetadataResponseHandler;
import com.baidubce.http.handler.HttpResponseHandler;
import com.baidubce.internal.InternalRequest;
import com.baidubce.internal.RestartableInputStream;
import com.baidubce.model.AbstractBceRequest;
import com.baidubce.services.cdn.model.ListDomainsRequest;
import com.baidubce.services.cdn.model.ListDomainsResponse;
import com.baidubce.services.cdn.model.PrefetchRequest;
import com.baidubce.services.cdn.model.PrefetchResponse;
import com.baidubce.services.cdn.model.PurgeRequest;
import com.baidubce.services.cdn.model.PurgeResponse;
import com.baidubce.services.cdn.model.GetPurgeStatusRequest;
import com.baidubce.services.cdn.model.GetPurgeStatusResponse;
import com.baidubce.services.cdn.model.GetPrefetchStatusRequest;
import com.baidubce.services.cdn.model.GetPrefetchStatusResponse;
import com.baidubce.services.cdn.model.GetStatFlowRequest;
import com.baidubce.services.cdn.model.GetStatFlowResponse;
import com.baidubce.util.HttpUtils;
import com.baidubce.util.JsonUtils;
import com.baidubce.util.DateUtils;
/**
* Client for accessing CDN Services.
* Created by sunyixing on 2016/1/9.
*/
public class CdnClient extends AbstractBceClient {
/**
* The version information for Document service APIs as URI prefix.
*/
private static final String VERSION = "v2";
/**
* The common URI prefix for domain operation.
*/
private static final String DOMAIN = "domain";
/**
* The common URI prefix for statistic services.
*/
private static final String STAT = "stat";
/**
* The common URI prefix for cache operation.
*/
private static final String CACHE = "cache";
/**
* Generate signature with specified headers.
*/
private static final String[] HEADERS_TO_SIGN = {"host", "x-bce-date"};
private static final HttpResponseHandler[] cdnHandlers = new HttpResponseHandler[] {
new BceMetadataResponseHandler(),
new BceErrorResponseHandler(),
new BceJsonResponseHandler()
};
/**
* Constructs a new Document client to invoke service methods on CDN.
*/
public CdnClient() {
this(new BceClientConfiguration());
}
/**
* Constructs a new client using the client configuration to access CDN services.
*
* @param clientConfiguration The client configuration options controlling how this client
* connects to Document services (e.g. proxy settings, retry counts, etc).
*/
public CdnClient(BceClientConfiguration clientConfiguration) {
super(clientConfiguration, cdnHandlers);
}
/**
* Returns a list of all CDN domains that the authenticated sender of the request owns.
*
* @return All of the CDN domains owned by the authenticated sender of the request.
*/
public ListDomainsResponse listDomains() {
return this.listDomains(new ListDomainsRequest());
}
/**
* Returns a list of all CDN domains that the authenticated sender of the request owns.
*
* @param request The request containing all of the options related to the listing of domains.
* @return All of the CDN domains owned by the authenticated sender of the request.
*/
public ListDomainsResponse listDomains(ListDomainsRequest request) {
checkNotNull(request, "The parameter request should NOT be null.");
InternalRequest internalRequest = createRequest(request, HttpMethodName.GET, DOMAIN);
return invokeHttpClient(internalRequest, ListDomainsResponse.class);
}
/**
* Post prefetch request
*
* @param request The request containing all of the urls to be prefetched.
* @return The task id
*/
public PrefetchResponse prefetch(PrefetchRequest request) {
InternalRequest internalRequest = this.createRequest(request, HttpMethodName.POST, CACHE, "prefetch");
this.attachRequestToBody(request, internalRequest);
return this.invokeHttpClient(internalRequest, PrefetchResponse.class);
}
/**
* Post purge request
* @param request The request containing all of the urls to be purged.
* @return The task id
*/
public PurgeResponse purge(PurgeRequest request) {
InternalRequest internalRequest = this.createRequest(request, HttpMethodName.POST, CACHE, "purge");
this.attachRequestToBody(request, internalRequest);
return this.invokeHttpClient(internalRequest, PurgeResponse.class);
}
/**
* Get purge status with specified attributes.
*
* @param request The request containing the task id returned by purge operation.
* @return Details of tasks
*/
public GetPurgeStatusResponse getPurgeStatus(GetPurgeStatusRequest request) {
InternalRequest internalRequest = this.createRequest(request, HttpMethodName.GET, CACHE, "purge");
if (request.getId() != null) {
internalRequest.addParameter("id", request.getId());
}
if (request.getStartTime() != null) {
internalRequest.addParameter("startTime", DateUtils.formatAlternateIso8601Date(request.getStartTime()));
}
if (request.getEndTime() != null) {
internalRequest.addParameter("endTime", DateUtils.formatAlternateIso8601Date(request.getEndTime()));
}
if (request.getMarker() != null) {
internalRequest.addParameter("marker", request.getMarker());
}
if (request.getUrl() != null) {
internalRequest.addParameter("url", request.getUrl());
}
return this.invokeHttpClient(internalRequest, GetPurgeStatusResponse.class);
}
/**
* Get prefetch status with specified attributes.
*
* @param request The request containing the task id returned by prefetch operation.
* @return Details of tasks
*/
public GetPrefetchStatusResponse getPrefetchStatus(GetPrefetchStatusRequest request) {
InternalRequest internalRequest = this.createRequest(request, HttpMethodName.GET, CACHE, "prefetch");
if (request.getId() != null) {
internalRequest.addParameter("id", request.getId());
}
if (request.getStartTime() != null) {
internalRequest.addParameter("startTime", DateUtils.formatAlternateIso8601Date(request.getStartTime()));
}
if (request.getEndTime() != null) {
internalRequest.addParameter("endTime", DateUtils.formatAlternateIso8601Date(request.getEndTime()));
}
if (request.getMarker() != null) {
internalRequest.addParameter("marker", request.getMarker());
}
if (request.getUrl() != null) {
internalRequest.addParameter("url", request.getUrl());
}
return this.invokeHttpClient(internalRequest, GetPrefetchStatusResponse.class);
}
/**
* Get flow statistics with specified attributes.
*
* @param request The request containing all the options related to the statistics.
* @return Details of statistics
*/
public GetStatFlowResponse getStatFlow(GetStatFlowRequest request) {
InternalRequest internalRequest = this.createRequest(request, HttpMethodName.GET, STAT, "flow");
if (request.getStartTime() != null) {
internalRequest.addParameter("startTime", DateUtils.formatAlternateIso8601Date(request.getStartTime()));
}
if (request.getEndTime() != null) {
internalRequest.addParameter("endTime", DateUtils.formatAlternateIso8601Date(request.getEndTime()));
}
if (request.getDomain() != null) {
internalRequest.addParameter("domain", request.getDomain());
}
if (request.getPeriod() != null) {
internalRequest.addParameter("period", String.valueOf(request.getPeriod()));
}
return this.invokeHttpClient(internalRequest, GetStatFlowResponse.class);
}
/**
* Creates and initializes a new request object for the specified resource.
*
* @param bceRequest The original BCE request created by the user.
* @param httpMethod The HTTP method to use when sending the request.
* @param pathVariables The optional variables used in the URI path.
* @return A new request object populated with endpoint, resource path and specific
* parameters to send.
*/
private InternalRequest createRequest(
AbstractBceRequest bceRequest, HttpMethodName httpMethod, String... pathVariables) {
List<String> path = new ArrayList<String>();
path.add(VERSION);
if (pathVariables != null) {
for (String pathVariable : pathVariables) {
path.add(pathVariable);
}
}
URI uri = HttpUtils.appendUri(this.getEndpoint(), path.toArray(new String[path.size()]));
InternalRequest request = new InternalRequest(httpMethod, uri);
SignOptions signOptions = new SignOptions();
signOptions.setHeadersToSign(new HashSet<String>(Arrays.asList(HEADERS_TO_SIGN)));
request.setSignOptions(signOptions);
request.setCredentials(bceRequest.getRequestCredentials());
return request;
}
/**
* put json object into http content for put or post request.
*
* @param request
* json object of rest request
* @param httpRequest
* http request object
*/
private void attachRequestToBody(AbstractBceRequest request, InternalRequest httpRequest) {
byte[] content;
try {
content = JsonUtils.toJsonString(request).getBytes("utf-8");
} catch (UnsupportedEncodingException e) {
throw new BceClientException("utf-8 encoding not supported!", e);
}
httpRequest.addHeader(Headers.CONTENT_LENGTH, String.valueOf(content.length));
httpRequest.addHeader(Headers.CONTENT_TYPE, "application/json; charset=utf-8");
httpRequest.setContent(RestartableInputStream.wrap(content));
}
}