Skip to content

Commit 762da4c

Browse files
authored
Merge pull request shadowsocks#1762 from V-E-O/master
make connection test url configurable
2 parents 63ae014 + 8e83272 commit 762da4c

File tree

5 files changed

+43
-21
lines changed

5 files changed

+43
-21
lines changed

mobile/src/main/java/com/github/shadowsocks/MainActivity.kt

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@ import android.support.v7.content.res.AppCompatResources
4141
import android.support.v7.preference.PreferenceDataStore
4242
import android.text.format.Formatter
4343
import android.util.Log
44+
import android.util.Patterns
4445
import android.view.View
46+
import android.webkit.URLUtil
4547
import android.widget.TextView
4648
import com.github.shadowsocks.App.Companion.app
4749
import com.github.shadowsocks.acl.Acl
@@ -65,6 +67,7 @@ import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem
6567
import java.io.IOException
6668
import java.net.HttpURLConnection
6769
import java.net.InetSocketAddress
70+
import java.net.MalformedURLException
6871
import java.net.Proxy
6972
import java.net.URL
7073
import java.util.*
@@ -162,28 +165,34 @@ class MainActivity : AppCompatActivity(), ShadowsocksConnection.Interface, Drawe
162165
* Based on: https://android.googlesource.com/platform/frameworks/base/+/97bfd27/services/core/java/com/android/server/connectivity/NetworkMonitor.java#879
163166
*/
164167
private fun testConnection(id: Int) {
165-
val url = URL("https", when (app.currentProfile!!.route) {
166-
Acl.CHINALIST -> "www.qualcomm.cn"
167-
else -> "www.google.com"
168-
}, "/generate_204")
169-
val conn = (if (BaseService.usingVpnMode) url.openConnection() else
170-
url.openConnection(Proxy(Proxy.Type.SOCKS,
171-
InetSocketAddress("127.0.0.1", DataStore.portProxy))))
172-
as HttpURLConnection
173-
conn.setRequestProperty("Connection", "close")
174-
conn.instanceFollowRedirects = false
175-
conn.useCaches = false
176168
val (success, result) = try {
177-
val start = SystemClock.elapsedRealtime()
178-
val code = conn.responseCode
179-
val elapsed = SystemClock.elapsedRealtime() - start
180-
if (code == 204 || code == 200 && conn.responseLength == 0L)
181-
Pair(true, getString(R.string.connection_test_available, elapsed))
182-
else throw IOException(getString(R.string.connection_test_error_status_code, code))
183-
} catch (e: IOException) {
184-
Pair(false, getString(R.string.connection_test_error, e.message))
185-
} finally {
186-
conn.disconnect()
169+
val urlString = DataStore.testUrl
170+
val url = URL(urlString)
171+
if (url.protocol != "https")
172+
throw MalformedURLException(getString(R.string.connection_test_url_non_https, urlString))
173+
if (!URLUtil.isValidUrl(urlString) || !Patterns.WEB_URL.matcher(urlString).matches())
174+
throw MalformedURLException(getString(R.string.connection_test_url_invalid, urlString))
175+
val conn = (if (BaseService.usingVpnMode) url.openConnection() else
176+
url.openConnection(Proxy(Proxy.Type.SOCKS,
177+
InetSocketAddress("127.0.0.1", DataStore.portProxy))))
178+
as HttpURLConnection
179+
conn.setRequestProperty("Connection", "close")
180+
conn.instanceFollowRedirects = false
181+
conn.useCaches = false
182+
try {
183+
val start = SystemClock.elapsedRealtime()
184+
val code = conn.responseCode
185+
val elapsed = SystemClock.elapsedRealtime() - start
186+
if (code == 204 || code == 200 && conn.responseLength == 0L)
187+
Pair(true, getString(R.string.connection_test_available, elapsed))
188+
else throw IOException(getString(R.string.connection_test_error_status_code, code))
189+
} catch (e: IOException) {
190+
Pair(false, getString(R.string.connection_test_error, e.message))
191+
} finally {
192+
conn.disconnect()
193+
}
194+
} catch (e: MalformedURLException) {
195+
Pair(false, getString(R.string.connection_test_url_error, e.message))
187196
}
188197
if (testCount == id) app.handler.post {
189198
if (success) statusText.text = result else {

mobile/src/main/java/com/github/shadowsocks/preference/DataStore.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ object DataStore {
5151
}
5252
val canToggleLocked: Boolean get() = publicStore.getBoolean(Key.directBootAware) == true
5353
val directBootAware: Boolean get() = app.directBootSupported && canToggleLocked
54+
var testUrl: String
55+
get() = publicStore.getString(Key.testUrl) ?: "https://www.google.com/generate_204"
56+
set(value) = publicStore.putString(Key.testUrl, value)
5457
var serviceMode: String
5558
get() = publicStore.getString(Key.serviceMode) ?: Key.modeVpn
5659
set(value) = publicStore.putString(Key.serviceMode, value)
@@ -66,6 +69,7 @@ object DataStore {
6669

6770
fun initGlobal() {
6871
// temporary workaround for support lib bug
72+
if (publicStore.getString(Key.testUrl) == null) testUrl = testUrl
6973
if (publicStore.getString(Key.serviceMode) == null) serviceMode = serviceMode
7074
if (publicStore.getString(Key.portProxy) == null) portProxy = portProxy
7175
if (publicStore.getString(Key.portLocalDns) == null) portLocalDns = portLocalDns

mobile/src/main/java/com/github/shadowsocks/utils/Constants.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ object Key {
4949
const val bypass = "isBypassApps"
5050
const val udpdns = "isUdpDns"
5151
const val ipv6 = "isIpv6"
52+
const val testUrl = "testUrl"
5253

5354
const val host = "proxy"
5455
const val password = "sitekey"

mobile/src/main/res/values/strings.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,13 @@
2020
<string name="traffic">%s↑\t%s↓</string>
2121
<string name="stat_summary">Sent: \t\t\t\t\t%3$s\t↑\t%1$s\nReceived: \t%4$s\t↓\t%2$s</string>
2222
<string name="speed">%s/s</string>
23+
<string name="connection_test_url">Connection Test URL</string>
2324
<string name="connection_test_pending">Check Connectivity</string>
2425
<string name="connection_test_testing">Testing…</string>
2526
<string name="connection_test_available">Success: %dms latency</string>
27+
<string name="connection_test_url_error">Check connection test URL. %s</string>
28+
<string name="connection_test_url_non_https">Non-HTTPS URL: %s</string>
29+
<string name="connection_test_url_invalid">Invalid URL: %s</string>
2630
<string name="connection_test_error">Fail to detect internet connection: %s</string>
2731
<string name="connection_test_fail">Internet Unavailable</string>
2832
<string name="connection_test_error_status_code">Error code: #%d</string>

mobile/src/main/res/xml/pref_global.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@
1212
<SwitchPreference android:key="tcp_fastopen"
1313
android:summary="@string/tcp_fastopen_summary"
1414
android:title="TCP Fast Open"/>
15+
<AutoSummaryEditTextPreference
16+
android:key="testUrl"
17+
android:title="@string/connection_test_url"
18+
app:pref_summaryHasText="%s"/>
1519
<PreferenceCategory
1620
android:title="@string/advanced">
1721
<SimpleMenuPreference

0 commit comments

Comments
 (0)