diff --git a/oss-android-sdk/src/androidTest/java/com/alibaba/sdk/android/BaseTestCase.java b/oss-android-sdk/src/androidTest/java/com/alibaba/sdk/android/BaseTestCase.java index 76420caa..63e0f232 100644 --- a/oss-android-sdk/src/androidTest/java/com/alibaba/sdk/android/BaseTestCase.java +++ b/oss-android-sdk/src/androidTest/java/com/alibaba/sdk/android/BaseTestCase.java @@ -6,6 +6,7 @@ import com.alibaba.sdk.android.oss.OSS; import com.alibaba.sdk.android.oss.OSSClient; import com.alibaba.sdk.android.oss.common.OSSLog; +import com.alibaba.sdk.android.oss.common.utils.HttpdnsMini; import com.alibaba.sdk.android.oss.model.CreateBucketRequest; import static com.alibaba.sdk.android.oss.model.CannedAccessControlList.PublicReadWrite; @@ -22,11 +23,13 @@ public abstract class BaseTestCase extends AndroidTestCase { abstract void initTestData() throws Exception; protected void initOSSClient() { + HttpdnsMini.getInstance().isHttp2Test = false; ClientConfiguration conf = new ClientConfiguration(); - conf.setConnectionTimeout(15 * 1000); // 连接超时,默认15秒 - conf.setSocketTimeout(15 * 1000); // socket超时,默认15秒 - conf.setMaxConcurrentRequest(5); // 最大并发请求书,默认5个 - conf.setMaxErrorRetry(2); // 失败后最大重试次数,默认2次 + //ClientConfiguration 链接和socket 已经改为60s了 +// conf.setConnectionTimeout(60 * 1000); // 连接超时,默认15秒 +// conf.setSocketTimeout(60 * 1000); // socket超时,默认15秒 +// conf.setMaxConcurrentRequest(5); // 最大并发请求书,默认5个 +// conf.setMaxErrorRetry(2); // 失败后最大重试次数,默认2次 // conf.setHttpDnsEnable(false); oss = new OSSClient(getContext(), OSSTestConfig.ENDPOINT, OSSTestConfig.credentialProvider,conf); } diff --git a/oss-android-sdk/src/androidTest/java/com/alibaba/sdk/android/OSSHttp2Test.java b/oss-android-sdk/src/androidTest/java/com/alibaba/sdk/android/OSSHttp2Test.java new file mode 100644 index 00000000..464cd888 --- /dev/null +++ b/oss-android-sdk/src/androidTest/java/com/alibaba/sdk/android/OSSHttp2Test.java @@ -0,0 +1,90 @@ +package com.alibaba.sdk.android; + +import android.test.AndroidTestCase; + +import com.alibaba.sdk.android.oss.ClientConfiguration; +import com.alibaba.sdk.android.oss.OSS; +import com.alibaba.sdk.android.oss.OSSClient; +import com.alibaba.sdk.android.oss.common.OSSLog; +import com.alibaba.sdk.android.oss.common.utils.HttpdnsMini; +import com.alibaba.sdk.android.oss.internal.OSSAsyncTask; +import com.alibaba.sdk.android.oss.model.GetObjectRequest; +import com.alibaba.sdk.android.oss.model.HeadObjectRequest; +import com.alibaba.sdk.android.oss.model.HeadObjectResult; +import com.alibaba.sdk.android.oss.model.PutObjectRequest; + +/** + * Created by wangzheng on 2018/8/2. + */ + +public class OSSHttp2Test extends AndroidTestCase { + protected String mBucketName; + protected OSS oss; + + + void initTestData() throws Exception { + OSSTestConfig.initLocalFile(); + OSSTestConfig.initDemoFile("guihua.zip"); + OSSTestConfig.initDemoFile("demo.pdf"); + } + + protected void initOSSClient() { + HttpdnsMini.getInstance().isHttp2Test = true; + ClientConfiguration conf = new ClientConfiguration(); + conf.setConnectionTimeout(60 * 1000); // 连接超时,默认60秒 + conf.setSocketTimeout(60 * 1000); // socket超时,默认60秒 + conf.setMaxConcurrentRequest(5); // 最大并发请求书,默认5个 + conf.setMaxErrorRetry(2); // 失败后最大重试次数,默认2次 + oss = new OSSClient(getContext(), OSSTestConfig.ENDPOINT, OSSTestConfig.credentialProvider,conf); + OSSLog.enableLog(); + } + + + @Override + protected void setUp() throws Exception { + super.setUp(); + mBucketName = "zq-beijing"; + OSSTestConfig.instance(getContext()); + if (oss == null) { + OSSLog.enableLog(); + initOSSClient(); + initTestData(); + } + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + + public void testMultiOperaion() throws Exception{ + String fileName = "file1m.jpg"; + + for (int i = 0; i < 30; i++){ + OSSLog.logDebug("===== " + i + " ====="); + PutObjectRequest put = new PutObjectRequest(mBucketName, fileName, + OSSTestConfig.FILE_DIR + "file1m"); + OSSTestConfig.TestPutCallback putCallback = new OSSTestConfig.TestPutCallback(); + + OSSAsyncTask task = oss.asyncPutObject(put, putCallback); + task.waitUntilFinished(); + assertEquals(200, putCallback.result.getStatusCode()); + + HeadObjectRequest head = new HeadObjectRequest(mBucketName, fileName); + HeadObjectResult headResult = oss.headObject(head); + + assertEquals("image/jpeg", headResult.getMetadata().getContentType()); + + + GetObjectRequest request = new GetObjectRequest(mBucketName, fileName); + OSSTestConfig.TestGetCallback getCallback = new OSSTestConfig.TestGetCallback(); + + OSSAsyncTask getTask = oss.asyncGetObject(request, getCallback); + getTask.waitUntilFinished(); + + assertEquals(200, getCallback.result.getStatusCode()); + } + } + +} diff --git a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/ClientConfiguration.java b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/ClientConfiguration.java index 97283eda..09428c9d 100644 --- a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/ClientConfiguration.java +++ b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/ClientConfiguration.java @@ -18,8 +18,8 @@ public class ClientConfiguration { private static final int DEFAULT_MAX_RETRIES = 2; private int maxConcurrentRequest = 5; - private int socketTimeout = 15 * 1000; - private int connectionTimeout = 15 * 1000; + private int socketTimeout = 60 * 1000; + private int connectionTimeout = 60 * 1000; private long max_log_size = 5 * 1024 * 1024; private int maxErrorRetry = DEFAULT_MAX_RETRIES; private List customCnameExcludeList = new ArrayList(); diff --git a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/common/utils/CaseInsensitiveHashMap.java b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/common/utils/CaseInsensitiveHashMap.java new file mode 100644 index 00000000..3c4ed014 --- /dev/null +++ b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/common/utils/CaseInsensitiveHashMap.java @@ -0,0 +1,26 @@ +package com.alibaba.sdk.android.oss.common.utils; + +import java.util.HashMap; + +/** + * Created by wangzheng on 2018/7/12. + */ + +public class CaseInsensitiveHashMap extends HashMap { + @Override + //只能做到小写和驼峰兼容。 + public v get(Object key) { + //兼容http2.0 + if (key != null && !containsKey(key) && key instanceof String){ + String lowCaseKey = ((String) key).toLowerCase(); + if (containsKey(lowCaseKey)){ + return get(lowCaseKey); + }else{ + return null; + } + } + return super.get(key); + } + + +} \ No newline at end of file diff --git a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/common/utils/HttpdnsMini.java b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/common/utils/HttpdnsMini.java index f31bf444..3eef8986 100644 --- a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/common/utils/HttpdnsMini.java +++ b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/common/utils/HttpdnsMini.java @@ -36,6 +36,8 @@ public class HttpdnsMini { private ConcurrentMap hostManager = new ConcurrentHashMap(); private ExecutorService pool = Executors.newFixedThreadPool(MAX_THREAD_NUM); + public boolean isHttp2Test = false; + private HttpdnsMini() { } @@ -51,6 +53,9 @@ public static HttpdnsMini getInstance() { } public String getIpByHostAsync(String hostName) { + if (isHttp2Test){ + return "118.178.62.19"; + } HostObject host = hostManager.get(hostName); if (host == null || host.isExpired()) { OSSLog.logDebug("[httpdnsmini] - refresh host: " + hostName); diff --git a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/internal/AbstractResponseParser.java b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/internal/AbstractResponseParser.java index b928d4da..4388ab0d 100644 --- a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/internal/AbstractResponseParser.java +++ b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/internal/AbstractResponseParser.java @@ -2,6 +2,7 @@ import com.alibaba.sdk.android.oss.common.OSSHeaders; import com.alibaba.sdk.android.oss.common.OSSLog; +import com.alibaba.sdk.android.oss.common.utils.CaseInsensitiveHashMap; import com.alibaba.sdk.android.oss.model.OSSResult; import java.io.IOException; @@ -70,8 +71,8 @@ public T parse(ResponseMessage response) throws IOException { } //处理返回信息的信息头 - private Map parseResponseHeader(Response response) { - Map result = new HashMap(); + private CaseInsensitiveHashMap parseResponseHeader(Response response) { + CaseInsensitiveHashMap result = new CaseInsensitiveHashMap(); Headers headers = response.headers(); for (int i = 0; i < headers.size(); i++) { result.put(headers.name(i), headers.value(i)); diff --git a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/internal/HttpMessage.java b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/internal/HttpMessage.java index 46c8db2f..bee83be5 100644 --- a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/internal/HttpMessage.java +++ b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/internal/HttpMessage.java @@ -1,5 +1,7 @@ package com.alibaba.sdk.android.oss.internal; +import com.alibaba.sdk.android.oss.common.utils.CaseInsensitiveHashMap; + import java.io.IOException; import java.io.InputStream; import java.util.HashMap; @@ -10,7 +12,7 @@ */ abstract class HttpMessage { - private Map headers = new HashMap(); + private Map headers = new CaseInsensitiveHashMap(); private InputStream content; private long contentLength; private String stringBody; @@ -21,7 +23,7 @@ public Map getHeaders() { public void setHeaders(Map headers) { if (this.headers == null) { - this.headers = new HashMap(); + this.headers = new CaseInsensitiveHashMap(); } if (this.headers != null && this.headers.size() > 0) { this.headers.clear(); diff --git a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/internal/ResponseParsers.java b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/internal/ResponseParsers.java index a864ed56..cc9a7042 100644 --- a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/internal/ResponseParsers.java +++ b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/internal/ResponseParsers.java @@ -615,16 +615,16 @@ public static ObjectMetadata parseObjectMetadata(Map headers) if (key.indexOf(OSSHeaders.OSS_USER_METADATA_PREFIX) >= 0) { objectMetadata.addUserMetadata(key, headers.get(key)); - } else if (key.equals(OSSHeaders.LAST_MODIFIED) || key.equals(OSSHeaders.DATE)) { + } else if (key.equalsIgnoreCase(OSSHeaders.LAST_MODIFIED) || key.equalsIgnoreCase(OSSHeaders.DATE)) { try { objectMetadata.setHeader(key, DateUtil.parseRfc822Date(headers.get(key))); } catch (ParseException pe) { throw new IOException(pe.getMessage(), pe); } - } else if (key.equals(OSSHeaders.CONTENT_LENGTH)) { + } else if (key.equalsIgnoreCase(OSSHeaders.CONTENT_LENGTH)) { Long value = Long.valueOf(headers.get(key)); objectMetadata.setHeader(key, value); - } else if (key.equals(OSSHeaders.ETAG)) { + } else if (key.equalsIgnoreCase(OSSHeaders.ETAG)) { objectMetadata.setHeader(key, trimQuotes(headers.get(key))); } else { objectMetadata.setHeader(key, headers.get(key)); diff --git a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/model/ObjectMetadata.java b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/model/ObjectMetadata.java index c4c1e124..0e95094e 100644 --- a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/model/ObjectMetadata.java +++ b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/model/ObjectMetadata.java @@ -2,6 +2,7 @@ import com.alibaba.sdk.android.oss.common.OSSConstants; import com.alibaba.sdk.android.oss.common.OSSHeaders; +import com.alibaba.sdk.android.oss.common.utils.CaseInsensitiveHashMap; import com.alibaba.sdk.android.oss.common.utils.DateUtil; import java.text.ParseException; @@ -19,9 +20,9 @@ public class ObjectMetadata { public static final String AES_256_SERVER_SIDE_ENCRYPTION = "AES256"; // User's custom metadata dictionary. All keys will be prefixed with x-oss-meta-in the HTTP headers. // But the keys in this dictionary does not include x-oss-meta-in. - private Map userMetadata = new HashMap(); + private Map userMetadata = new CaseInsensitiveHashMap(); // Standard metadata - private Map metadata = new HashMap(); + private Map metadata = new CaseInsensitiveHashMap(); /** *