Skip to content

Commit ef18bab

Browse files
[improve] Allow download link with basic auth (#19750)
Co-authored-by: tison <wander4096@gmail.com>
1 parent 2b4a3c1 commit ef18bab

3 files changed

Lines changed: 46 additions & 23 deletions

File tree

pulsar-client/src/main/java/org/apache/pulsar/client/impl/auth/AuthenticationDataBasic.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,20 @@
2727

2828
public class AuthenticationDataBasic implements AuthenticationDataProvider {
2929
private static final String HTTP_HEADER_NAME = "Authorization";
30-
private String httpAuthToken;
31-
private String commandAuthToken;
32-
private Map<String, String> headers = new HashMap<>();
30+
private final String commandAuthToken;
31+
private final Map<String, String> headers;
3332

3433
public AuthenticationDataBasic(String userId, String password) {
35-
httpAuthToken = "Basic " + Base64.getEncoder().encodeToString((userId + ":" + password).getBytes());
36-
commandAuthToken = userId + ":" + password;
37-
headers.put(HTTP_HEADER_NAME, httpAuthToken);
38-
headers.put(PULSAR_AUTH_METHOD_NAME, AuthenticationBasic.AUTH_METHOD_NAME);
39-
this.headers = Collections.unmodifiableMap(this.headers);
34+
this(userId + ":" + password);
35+
}
36+
37+
public AuthenticationDataBasic(String userInfo) {
38+
String httpAuthToken = "Basic " + Base64.getEncoder().encodeToString(userInfo.getBytes());
39+
this.commandAuthToken = userInfo;
40+
this.headers = Collections.unmodifiableMap(new HashMap<String, String>(){{
41+
put(HTTP_HEADER_NAME, httpAuthToken);
42+
put(PULSAR_AUTH_METHOD_NAME, AuthenticationBasic.AUTH_METHOD_NAME);
43+
}});
4044
}
4145

4246
@Override

pulsar-functions/utils/src/main/java/org/apache/pulsar/functions/utils/FunctionCommon.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,11 @@
3535
import java.net.ServerSocket;
3636
import java.net.URISyntaxException;
3737
import java.net.URL;
38+
import java.net.URLConnection;
3839
import java.nio.file.Files;
3940
import java.nio.file.StandardCopyOption;
4041
import java.util.Collection;
42+
import java.util.Map;
4143
import java.util.UUID;
4244
import lombok.AccessLevel;
4345
import lombok.NoArgsConstructor;
@@ -48,6 +50,7 @@
4850
import org.apache.pulsar.client.api.MessageId;
4951
import org.apache.pulsar.client.api.SubscriptionInitialPosition;
5052
import org.apache.pulsar.client.impl.MessageIdImpl;
53+
import org.apache.pulsar.client.impl.auth.AuthenticationDataBasic;
5154
import org.apache.pulsar.common.functions.FunctionConfig;
5255
import org.apache.pulsar.common.functions.Utils;
5356
import org.apache.pulsar.common.nar.NarClassLoader;
@@ -245,8 +248,15 @@ public static Class<?> getSinkType(Class sinkClass) {
245248
}
246249

247250
public static void downloadFromHttpUrl(String destPkgUrl, File targetFile) throws IOException {
248-
URL website = new URL(destPkgUrl);
249-
try (InputStream in = website.openStream()) {
251+
final URL url = new URL(destPkgUrl);
252+
final URLConnection connection = url.openConnection();
253+
if (StringUtils.isNotEmpty(url.getUserInfo())) {
254+
final AuthenticationDataBasic authBasic = new AuthenticationDataBasic(url.getUserInfo());
255+
for (Map.Entry<String, String> header : authBasic.getHttpHeaders()) {
256+
connection.setRequestProperty(header.getKey(), header.getValue());
257+
}
258+
}
259+
try (InputStream in = connection.getInputStream()) {
250260
log.info("Downloading function package from {} to {} ...", destPkgUrl, targetFile.getAbsoluteFile());
251261
Files.copy(in, targetFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
252262
}

pulsar-functions/utils/src/test/java/org/apache/pulsar/functions/utils/FunctionCommonTest.java

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@
1818
*/
1919
package org.apache.pulsar.functions.utils;
2020

21+
import static org.assertj.core.api.Assertions.assertThat;
22+
import static org.mockito.Mockito.mock;
23+
import static org.mockito.Mockito.when;
24+
import static org.testng.Assert.assertEquals;
25+
import java.io.File;
2126
import java.util.Collection;
2227
import org.apache.pulsar.client.impl.MessageIdImpl;
2328
import org.apache.pulsar.common.util.FutureUtil;
@@ -26,17 +31,11 @@
2631
import org.apache.pulsar.functions.api.Record;
2732
import org.apache.pulsar.functions.api.WindowContext;
2833
import org.apache.pulsar.functions.api.WindowFunction;
34+
import org.assertj.core.util.Files;
2935
import org.testng.Assert;
3036
import org.testng.annotations.DataProvider;
3137
import org.testng.annotations.Test;
3238

33-
import java.io.File;
34-
import java.util.UUID;
35-
36-
import static org.mockito.Mockito.mock;
37-
import static org.mockito.Mockito.when;
38-
import static org.testng.Assert.assertEquals;
39-
4039
/**
4140
* Unit test of {@link Exceptions}.
4241
*/
@@ -78,12 +77,22 @@ public void testValidateHttpFileUrl() throws Exception {
7877

7978
@Test
8079
public void testDownloadFile() throws Exception {
81-
String jarHttpUrl = "https://repo1.maven.org/maven2/org/apache/pulsar/pulsar-common/2.4.2/pulsar-common-2.4.2.jar";
82-
String testDir = FunctionCommonTest.class.getProtectionDomain().getCodeSource().getLocation().getPath();
83-
File pkgFile = new File(testDir, UUID.randomUUID().toString());
84-
FunctionCommon.downloadFromHttpUrl(jarHttpUrl, pkgFile);
85-
Assert.assertTrue(pkgFile.exists());
86-
pkgFile.delete();
80+
final String jarHttpUrl = "https://repo1.maven.org/maven2/org/apache/pulsar/pulsar-common/2.4.2/pulsar-common-2.4.2.jar";
81+
final File file = Files.newTemporaryFile();
82+
file.deleteOnExit();
83+
assertThat(file.length()).isZero();
84+
FunctionCommon.downloadFromHttpUrl(jarHttpUrl, file);
85+
assertThat(file.length()).isGreaterThan(0);
86+
}
87+
88+
@Test
89+
public void testDownloadFileWithBasicAuth() throws Exception {
90+
final String jarHttpUrl = "https://foo:bar@httpbin.org/basic-auth/foo/bar";
91+
final File file = Files.newTemporaryFile();
92+
file.deleteOnExit();
93+
assertThat(file.length()).isZero();
94+
FunctionCommon.downloadFromHttpUrl(jarHttpUrl, file);
95+
assertThat(file.length()).isGreaterThan(0);
8796
}
8897

8998
@Test

0 commit comments

Comments
 (0)