From 4736d080a1c5d6d3a26d436ecf3d271da248bd35 Mon Sep 17 00:00:00 2001 From: Vshnv Date: Mon, 29 Mar 2021 19:01:58 +0530 Subject: [PATCH] Added proxy support for XEP-0363 --- .../httpfileupload/HttpFileUploadManager.java | 33 ++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/httpfileupload/HttpFileUploadManager.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/httpfileupload/HttpFileUploadManager.java index 23379a4cc..4e7f4a19e 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/httpfileupload/HttpFileUploadManager.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/httpfileupload/HttpFileUploadManager.java @@ -27,7 +27,6 @@ import java.net.HttpURLConnection; import java.net.URL; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.Objects; import java.util.WeakHashMap; import java.util.logging.Level; @@ -37,6 +36,7 @@ import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; +import org.jivesoftware.smack.AbstractXMPPConnection; import org.jivesoftware.smack.ConnectionCreationListener; import org.jivesoftware.smack.ConnectionListener; import org.jivesoftware.smack.Manager; @@ -46,6 +46,7 @@ import org.jivesoftware.smack.XMPPConnectionRegistry; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.XMPPException.XMPPErrorException; +import org.jivesoftware.smack.proxy.ProxyInfo; import org.jivesoftware.smackx.disco.ServiceDiscoveryManager; import org.jivesoftware.smackx.disco.packet.DiscoverInfo; import org.jivesoftware.smackx.httpfileupload.UploadService.Version; @@ -429,15 +430,15 @@ public final class HttpFileUploadManager extends Manager { private void upload(InputStream iStream, long fileSize, Slot slot, UploadProgressListener listener) throws IOException { final URL putUrl = slot.getPutUrl(); - - final HttpURLConnection urlConnection = (HttpURLConnection) putUrl.openConnection(); + final XMPPConnection connection = connection(); + final HttpURLConnection urlConnection = createURLConnection(connection, putUrl); urlConnection.setRequestMethod("PUT"); urlConnection.setUseCaches(false); urlConnection.setDoOutput(true); urlConnection.setFixedLengthStreamingMode(fileSize); urlConnection.setRequestProperty("Content-Type", "application/octet-stream"); - for (Entry header : slot.getHeaders().entrySet()) { + for (Map.Entry header : slot.getHeaders().entrySet()) { urlConnection.setRequestProperty(header.getKey(), header.getValue()); } @@ -503,6 +504,30 @@ public final class HttpFileUploadManager extends Manager { } } + private static HttpURLConnection createURLConnection(XMPPConnection connection, URL putUrl) throws IOException { + Objects.requireNonNull(connection); + Objects.requireNonNull(putUrl); + ProxyInfo proxyInfo = fetchProxyInfo(connection); + if (proxyInfo != null) { + return createProxiedURLConnection(proxyInfo, putUrl); + } + return (HttpURLConnection) putUrl.openConnection(); + } + + private static HttpURLConnection createProxiedURLConnection(ProxyInfo proxyInfo, URL putUrl) throws IOException { + Objects.requireNonNull(proxyInfo); + Objects.requireNonNull(putUrl); + return (HttpURLConnection) putUrl.openConnection(proxyInfo.toJavaProxy()); + } + + private static ProxyInfo fetchProxyInfo(XMPPConnection connection) { + if (!(connection instanceof AbstractXMPPConnection)) { + return null; + } + AbstractXMPPConnection xmppConnection = (AbstractXMPPConnection) connection; + return xmppConnection.getConfiguration().getProxyInfo(); + } + public static UploadService.Version namespaceToVersion(String namespace) { UploadService.Version version; switch (namespace) {