From 1a230a26f83e75e0dc149b1f4b859966a3c44ed1 Mon Sep 17 00:00:00 2001 From: Jemy Date: Fri, 6 Jan 2017 16:18:53 +0800 Subject: [PATCH 1/3] add cdn get bandwidth data, get flux data and cdn prefetch function --- src/main/java/com/qiniu/cdn/CdnManager.java | 40 ++++++++++++++++++ src/test/java/com/qiniu/CdnTest.java | 46 +++++++++++++++++++++ 2 files changed, 86 insertions(+) diff --git a/src/main/java/com/qiniu/cdn/CdnManager.java b/src/main/java/com/qiniu/cdn/CdnManager.java index 994494826..7e15b6c85 100644 --- a/src/main/java/com/qiniu/cdn/CdnManager.java +++ b/src/main/java/com/qiniu/cdn/CdnManager.java @@ -7,6 +7,7 @@ import com.qiniu.util.Auth; import com.qiniu.util.Json; import com.qiniu.util.StringMap; +import com.qiniu.util.StringUtils; import java.util.HashMap; @@ -50,4 +51,43 @@ public Response refreshUrlsAndDirs(String[] urls, String[] dirs) throws QiniuExc StringMap headers = auth.authorizationV2(url, "POST", body, Client.JsonMime); return client.post(url, body, headers, Client.JsonMime); } + + public Response prefetchUrls(String[] urls) throws QiniuException { + HashMap req = new HashMap<>(); + req.put("urls", urls); + byte[] body = Json.encode(req).getBytes(Constants.UTF_8); + String url = server + "/v2/tune/prefetch"; + StringMap headers = auth.authorizationV2(url, "POST", body, Client.JsonMime); + return client.post(url, body, headers, Client.JsonMime); + } + + public Response getBandwidthData(String[] domains, String startDate, String endDate, + String granularity) throws QiniuException { + HashMap req = new HashMap<>(); + req.put("domains", StringUtils.join(domains, ";")); + req.put("startDate", startDate); + req.put("endDate", endDate); + req.put("granularity", granularity); + + byte[] body = Json.encode(req).getBytes(Constants.UTF_8); + String url = server + "/v2/tune/bandwidth"; + StringMap headers = auth.authorizationV2(url, "POST", body, Client.JsonMime); + return client.post(url, body, headers, Client.JsonMime); + } + + public Response getFluxData(String[] domains, String startDate, String endDate, + String granularity) throws QiniuException { + HashMap req = new HashMap<>(); + req.put("domains", StringUtils.join(domains, ";")); + req.put("startDate", startDate); + req.put("endDate", endDate); + req.put("granularity", granularity); + + byte[] body = Json.encode(req).getBytes(Constants.UTF_8); + String url = server + "/v2/tune/flux"; + StringMap headers = auth.authorizationV2(url, "POST", body, Client.JsonMime); + return client.post(url, body, headers, Client.JsonMime); + } + + } diff --git a/src/test/java/com/qiniu/CdnTest.java b/src/test/java/com/qiniu/CdnTest.java index 833a6d13d..2557d1158 100644 --- a/src/test/java/com/qiniu/CdnTest.java +++ b/src/test/java/com/qiniu/CdnTest.java @@ -21,6 +21,52 @@ public void testRefresh() { e.printStackTrace(); Assert.fail(); } + } + + @Test + public void testPrefetch() { + CdnManager c = new CdnManager(TestConfig.testAuth); + Response r = null; + try { + r = c.prefetchUrls(new String[]{"http://javasdk.qiniudn.com/gopher.jpg"}); + Assert.assertEquals(200, r.statusCode); + } catch (QiniuException e) { + e.printStackTrace(); + Assert.fail(); + } + } + + @Test + public void testGetBandwidth() { + CdnManager c = new CdnManager(TestConfig.testAuth); + Response r = null; + String[] domains = {TestConfig.domain}; + String startDate = "2017-01-01"; + String endDate = "2017-01-06"; + String granularity = "day"; + try { + r = c.getBandwidthData(domains, startDate, endDate, granularity); + Assert.assertEquals(200, r.statusCode); + } catch (QiniuException e) { + e.printStackTrace(); + Assert.fail(); + } + } + @Test + public void testGetFlux() { + CdnManager c = new CdnManager(TestConfig.testAuth); + Response r = null; + String[] domains = {TestConfig.domain}; + String startDate = "2017-01-01"; + String endDate = "2017-01-06"; + String granularity = "day"; + try { + r = c.getFluxData(domains, startDate, endDate, granularity); + Assert.assertEquals(200, r.statusCode); + } catch (QiniuException e) { + e.printStackTrace(); + Assert.fail(); + } } } From 28759b50fd5f4f4de66ed82caf2ec37a1c26881a Mon Sep 17 00:00:00 2001 From: Jemy Date: Sat, 7 Jan 2017 11:28:23 +0800 Subject: [PATCH 2/3] set test ak sk, otherwise travis will fail to get system env params --- src/test/java/com/qiniu/streaming/StreamingTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/qiniu/streaming/StreamingTest.java b/src/test/java/com/qiniu/streaming/StreamingTest.java index 5cee6dc1b..93596d8de 100644 --- a/src/test/java/com/qiniu/streaming/StreamingTest.java +++ b/src/test/java/com/qiniu/streaming/StreamingTest.java @@ -1,5 +1,6 @@ package com.qiniu.streaming; +import com.qiniu.TestConfig; import com.qiniu.common.QiniuException; import com.qiniu.streaming.model.ActivityRecords; import com.qiniu.streaming.model.StreamAttribute; @@ -14,7 +15,7 @@ * Created by bailong on 16/9/22. */ public class StreamingTest { - private Auth auth = Auth.create(System.getenv("ak"), System.getenv("sk")); + private Auth auth = TestConfig.testAuth; private String hub = "pilisdktest"; private String streamKeyPrefix = "pilijava" + System.currentTimeMillis(); private StreamingManager manager = new StreamingManager(auth, hub); From 2f2ff8125e7a21c07093225bb2e7a3417685ce23 Mon Sep 17 00:00:00 2001 From: Jemy Date: Sat, 7 Jan 2017 14:08:42 +0800 Subject: [PATCH 3/3] add get cdn log list and create anti leech url based on timestamp --- src/main/java/com/qiniu/cdn/CdnManager.java | 84 +++++++++++++++++++ src/main/java/com/qiniu/util/StringUtils.java | 11 +++ src/test/java/com/qiniu/CdnTest.java | 52 ++++++++++++ 3 files changed, 147 insertions(+) diff --git a/src/main/java/com/qiniu/cdn/CdnManager.java b/src/main/java/com/qiniu/cdn/CdnManager.java index 7e15b6c85..6d2eaaf28 100644 --- a/src/main/java/com/qiniu/cdn/CdnManager.java +++ b/src/main/java/com/qiniu/cdn/CdnManager.java @@ -9,6 +9,11 @@ import com.qiniu.util.StringMap; import com.qiniu.util.StringUtils; +import java.io.UnsupportedEncodingException; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLEncoder; +import java.security.NoSuchAlgorithmException; import java.util.HashMap; /** @@ -30,10 +35,21 @@ private CdnManager(Auth auth, String server) { Constants.CONNECT_TIMEOUT, Constants.RESPONSE_TIMEOUT, Constants.WRITE_TIMEOUT); } + /** + * 刷新链接列表,每次最多不可以超过100条链接 + * + * @link http://developer.qiniu.com/article/fusion/api/refresh.html + */ public Response refreshUrls(String[] urls) throws QiniuException { return refreshUrlsAndDirs(urls, null); } + /** + * 刷新目录列表,每次最多不可以超过10个目录 + * 刷新目录需要额外开通权限,可以联系七牛技术支持处理 + * + * @link http://developer.qiniu.com/article/fusion/api/refresh.html + */ public Response refreshDirs(String[] dirs) throws QiniuException { return refreshUrlsAndDirs(null, dirs); } @@ -52,6 +68,11 @@ public Response refreshUrlsAndDirs(String[] urls, String[] dirs) throws QiniuExc return client.post(url, body, headers, Client.JsonMime); } + /** + * 预取文件链接,每次最多不可以超过100条 + * + * @link http://developer.qiniu.com/article/fusion/api/prefetch.html + */ public Response prefetchUrls(String[] urls) throws QiniuException { HashMap req = new HashMap<>(); req.put("urls", urls); @@ -61,6 +82,11 @@ public Response prefetchUrls(String[] urls) throws QiniuException { return client.post(url, body, headers, Client.JsonMime); } + /** + * 获取域名访问带宽数据 + * + * @link http://developer.qiniu.com/article/fusion/api/traffic-bandwidth.html + */ public Response getBandwidthData(String[] domains, String startDate, String endDate, String granularity) throws QiniuException { HashMap req = new HashMap<>(); @@ -75,6 +101,11 @@ public Response getBandwidthData(String[] domains, String startDate, String endD return client.post(url, body, headers, Client.JsonMime); } + /** + * 获取域名访问流量数据 + * + * @link http://developer.qiniu.com/article/fusion/api/traffic-bandwidth.html + */ public Response getFluxData(String[] domains, String startDate, String endDate, String granularity) throws QiniuException { HashMap req = new HashMap<>(); @@ -89,5 +120,58 @@ public Response getFluxData(String[] domains, String startDate, String endDate, return client.post(url, body, headers, Client.JsonMime); } + /** + * 获取CDN域名访问日志的下载链接 + * + * @link http://developer.qiniu.com/article/fusion/api/log.html + */ + public Response getCdnLogList(String[] domains, String logDate) throws QiniuException { + HashMap req = new HashMap<>(); + req.put("domains", StringUtils.join(domains, ";")); + req.put("day", logDate); + + byte[] body = Json.encode(req).getBytes(Constants.UTF_8); + String url = server + "/v2/tune/log/list"; + StringMap headers = auth.authorizationV2(url, "POST", body, Client.JsonMime); + return client.post(url, body, headers, Client.JsonMime); + } + /** + * 构建标准的基于时间戳的防盗链 + * + * @param host 自定义域名,例如 http://img.abc.com + * @param fileName 待访问的原始文件名,必须是utf8编码,不需要进行urlencode + * @param queryString 业务自身的查询参数,必须是utf8编码,不需要进行urlencode + * @param encryptKey 时间戳防盗链的签名密钥,从七牛后台获取 + * @param deadline 链接的有效期时间戳,是以秒为单位的Unix时间戳 + * @return signedUrl 最终的带时间戳防盗链的url + */ + public static String createStandardAntileechUrlBasedOnTimestamp( + String host, String fileName, String queryString, String encryptKey, long deadline) + throws UnsupportedEncodingException, MalformedURLException, NoSuchAlgorithmException { + String urlToSign; + if (queryString.trim().length() != 0) { + urlToSign = String.format("%s/%s?%s", host, URLEncoder.encode(fileName, "utf-8"), + URLEncoder.encode(queryString, "utf-8")); + } else { + urlToSign = String.format("%s/%s", host, URLEncoder.encode(fileName, "utf-8")); + } + + URL urlObj = new URL(urlToSign); + String path = urlObj.getPath(); + + String expireHex = Long.toHexString(deadline); + + String toSignStr = String.format("%s%s%s", encryptKey, path, expireHex); + String signedStr = StringUtils.md5Lower(toSignStr); + + String signedUrl; + if (urlObj.getQuery() != null) { + signedUrl = String.format("%s&sign=%s&t=%s", urlToSign, signedStr, expireHex); + } else { + signedUrl = String.format("%s?sign=%s&t=%s", urlToSign, signedStr, expireHex); + } + + return signedUrl; + } } diff --git a/src/main/java/com/qiniu/util/StringUtils.java b/src/main/java/com/qiniu/util/StringUtils.java index 399f66ff8..c53082c28 100644 --- a/src/main/java/com/qiniu/util/StringUtils.java +++ b/src/main/java/com/qiniu/util/StringUtils.java @@ -1,7 +1,11 @@ package com.qiniu.util; import com.qiniu.common.Constants; +import qiniu.happydns.util.Hex; +import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import java.util.Collection; /** @@ -133,5 +137,12 @@ public static byte[] utf8Bytes(String data) { public static String utf8String(byte[] data) { return new String(data, Constants.UTF_8); } + + public static String md5Lower(String src) throws UnsupportedEncodingException, NoSuchAlgorithmException { + MessageDigest digest = MessageDigest.getInstance("MD5"); + digest.update(src.getBytes("utf-8")); + byte[] md5Bytes = digest.digest(); + return Hex.encodeHexString(md5Bytes); + } } diff --git a/src/test/java/com/qiniu/CdnTest.java b/src/test/java/com/qiniu/CdnTest.java index 2557d1158..e1216055d 100644 --- a/src/test/java/com/qiniu/CdnTest.java +++ b/src/test/java/com/qiniu/CdnTest.java @@ -69,4 +69,56 @@ public void testGetFlux() { Assert.fail(); } } + + @Test + public void testGetCdnLogList() { + CdnManager c = new CdnManager(TestConfig.testAuth); + Response r = null; + String[] domains = {TestConfig.domain}; + String logDate = "2017-01-01"; + + try { + r = c.getCdnLogList(domains, logDate); + Assert.assertEquals(200, r.statusCode); + } catch (QiniuException e) { + e.printStackTrace(); + Assert.fail(); + } + } + + @Test + public void testCreateAntileechUrlBasedOnTimestampSimple() { + String host = "http://img.abc.com"; + String fileName = "2017/01/07/测试.png"; + String queryString = ""; + long deadline = System.currentTimeMillis() / 1000 + 3600; + String encryptKey = ""; + String signedUrl; + try { + signedUrl = CdnManager.createStandardAntileechUrlBasedOnTimestamp(host, fileName, + queryString, encryptKey, deadline); + System.out.println(signedUrl); + } catch (Exception ex) { + ex.printStackTrace(); + Assert.fail(); + } + } + + @Test + public void testCreateAntileechUrlBasedOnTimestampWithQueryString() { + String host = "http://video.abc.com"; + String fileName = "测试.mp4"; + String queryString = "name=七牛&year=2017"; + long deadline = System.currentTimeMillis() / 1000 + 3600; + String encryptKey = ""; + String signedUrl; + try { + signedUrl = CdnManager.createStandardAntileechUrlBasedOnTimestamp(host, fileName, + queryString, encryptKey, deadline); + System.out.println(signedUrl); + } catch (Exception ex) { + ex.printStackTrace(); + Assert.fail(); + } + } }