diff options
author | Ye Wen <ywen@google.com> | 2016-06-06 16:22:58 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2016-06-06 16:22:58 +0000 |
commit | 1becb59546b84bae2444d0c864d34bc8060e8c1c (patch) | |
tree | 825ece6d4e3d47bc50f407195342b10529e1367d | |
parent | 897ba902dce1393c51dde056d931826d1f573acc (diff) | |
parent | b2983ab5e813d407044a47d7ff881806e5fb85d6 (diff) | |
download | Mms-1becb59546b84bae2444d0c864d34bc8060e8c1c.tar.gz |
Wait for IPv4 provisioned when connecting to IPv4 MMS URL am: eeb364a1e8 am: 6987193d68
am: b2983ab5e8
* commit 'b2983ab5e813d407044a47d7ff881806e5fb85d6':
Wait for IPv4 provisioned when connecting to IPv4 MMS URL
Change-Id: I41497552a41ab401091432bc61f1c3135f3f1af5
-rw-r--r-- | src/com/android/mms/service/MmsHttpClient.java | 52 | ||||
-rw-r--r-- | src/com/android/mms/service/MmsNetworkManager.java | 2 | ||||
-rw-r--r-- | src/com/android/mms/service/SendRequest.java | 2 |
3 files changed, 50 insertions, 6 deletions
diff --git a/src/com/android/mms/service/MmsHttpClient.java b/src/com/android/mms/service/MmsHttpClient.java index b4d3ba6..1c88bbf 100644 --- a/src/com/android/mms/service/MmsHttpClient.java +++ b/src/com/android/mms/service/MmsHttpClient.java @@ -17,6 +17,8 @@ package com.android.mms.service; import android.content.Context; +import android.net.ConnectivityManager; +import android.net.LinkProperties; import android.net.Network; import android.os.Bundle; import android.telephony.SmsManager; @@ -25,7 +27,6 @@ import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.Base64; import android.util.Log; - import com.android.mms.service.exception.MmsHttpException; import java.io.BufferedInputStream; @@ -36,6 +37,8 @@ import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; +import java.net.Inet4Address; +import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.MalformedURLException; import java.net.ProtocolException; @@ -68,18 +71,24 @@ public class MmsHttpClient { private static final String HEADER_VALUE_CONTENT_TYPE_WITHOUT_CHARSET = "application/vnd.wap.mms-message"; + private static final int IPV4_WAIT_ATTEMPTS = 15; + private static final long IPV4_WAIT_DELAY_MS = 1000; // 1 seconds + private final Context mContext; private final Network mNetwork; + private final ConnectivityManager mConnectivityManager; /** * Constructor - * - * @param context The Context object + * @param context The Context object * @param network The Network for creating an OKHttp client + * @param connectivityManager */ - public MmsHttpClient(Context context, Network network) { + public MmsHttpClient(Context context, Network network, + ConnectivityManager connectivityManager) { mContext = context; mNetwork = network; + mConnectivityManager = connectivityManager; } /** @@ -113,6 +122,7 @@ public class MmsHttpClient { new InetSocketAddress(mNetwork.getByName(proxyHost), proxyPort)); } final URL url = new URL(urlString); + maybeWaitForIpv4(requestId, url); // Now get the connection connection = (HttpURLConnection) mNetwork.openConnection(url, proxy); connection.setDoInput(true); @@ -209,6 +219,40 @@ public class MmsHttpClient { } } + private void maybeWaitForIpv4(final String requestId, final URL url) { + // If it's a literal IPv4 address and we're on an IPv6-only network, + // wait until IPv4 is available. + Inet4Address ipv4Literal = null; + try { + ipv4Literal = (Inet4Address) InetAddress.parseNumericAddress(url.getHost()); + } catch (IllegalArgumentException | ClassCastException e) { + // Ignore + } + if (ipv4Literal == null) { + // Not an IPv4 address. + return; + } + for (int i = 0; i < IPV4_WAIT_ATTEMPTS; i++) { + final LinkProperties lp = mConnectivityManager.getLinkProperties(mNetwork); + if (lp != null) { + if (!lp.isReachable(ipv4Literal)) { + LogUtil.w(requestId, "HTTP: IPv4 not yet provisioned"); + try { + Thread.sleep(IPV4_WAIT_DELAY_MS); + } catch (InterruptedException e) { + // Ignore + } + } else { + LogUtil.i(requestId, "HTTP: IPv4 provisioned"); + break; + } + } else { + LogUtil.w(requestId, "HTTP: network disconnected, skip ipv4 check"); + break; + } + } + } + private static void logHttpHeaders(Map<String, List<String>> headers, String requestId) { final StringBuilder sb = new StringBuilder(); if (headers != null) { diff --git a/src/com/android/mms/service/MmsNetworkManager.java b/src/com/android/mms/service/MmsNetworkManager.java index ed78258..67b0af6 100644 --- a/src/com/android/mms/service/MmsNetworkManager.java +++ b/src/com/android/mms/service/MmsNetworkManager.java @@ -229,7 +229,7 @@ public class MmsNetworkManager { if (mMmsHttpClient == null) { if (mNetwork != null) { // Create new MmsHttpClient for the current Network - mMmsHttpClient = new MmsHttpClient(mContext, mNetwork); + mMmsHttpClient = new MmsHttpClient(mContext, mNetwork, mConnectivityManager); } } return mMmsHttpClient; diff --git a/src/com/android/mms/service/SendRequest.java b/src/com/android/mms/service/SendRequest.java index 435e12c..21cd43c 100644 --- a/src/com/android/mms/service/SendRequest.java +++ b/src/com/android/mms/service/SendRequest.java @@ -242,7 +242,7 @@ public class SendRequest extends MmsRequest { return ; } if (!(pdu instanceof SendReq)) { - LogUtil.e(requestId, "updateDestinationAddress: not SendReq"); + LogUtil.i(requestId, "updateDestinationAddress: not SendReq"); return; } |