1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package org.apache.hc.client5.http.impl.win;
28
29 import java.util.Locale;
30
31 import org.apache.hc.client5.http.auth.AuthSchemeFactory;
32 import org.apache.hc.client5.http.auth.StandardAuthScheme;
33 import org.apache.hc.client5.http.impl.auth.BasicSchemeFactory;
34 import org.apache.hc.client5.http.impl.auth.DigestSchemeFactory;
35 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
36 import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
37 import org.apache.hc.core5.http.config.Registry;
38 import org.apache.hc.core5.http.config.RegistryBuilder;
39
40 import com.sun.jna.platform.win32.Sspi;
41
42
43
44
45
46
47
48 public class WinHttpClients {
49
50 private WinHttpClients() {
51 super();
52 }
53
54 public static boolean isWinAuthAvailable() {
55 String os = System.getProperty("os.name");
56 os = os != null ? os.toLowerCase(Locale.ROOT) : null;
57 if (os != null && os.contains("windows")) {
58 try {
59 return Sspi.MAX_TOKEN_SIZE > 0;
60 } catch (final Exception ignore) {
61
62 }
63 }
64 return false;
65 }
66
67 private static HttpClientBuilder createBuilder() {
68 if (isWinAuthAvailable()) {
69 final Registry<AuthSchemeFactory> authSchemeRegistry = RegistryBuilder.<AuthSchemeFactory>create()
70 .register(StandardAuthScheme.BASIC, BasicSchemeFactory.INSTANCE)
71 .register(StandardAuthScheme.DIGEST, DigestSchemeFactory.INSTANCE)
72 .register(StandardAuthScheme.NTLM, WindowsNTLMSchemeFactory.DEFAULT)
73 .register(StandardAuthScheme.SPNEGO, WindowsNegotiateSchemeFactory.DEFAULT)
74 .build();
75 return HttpClientBuilder.create()
76 .setDefaultAuthSchemeRegistry(authSchemeRegistry);
77 }
78 return HttpClientBuilder.create();
79 }
80
81
82
83
84
85 public static HttpClientBuilder custom() {
86 return createBuilder();
87 }
88
89
90
91
92
93 public static CloseableHttpClient createDefault() {
94 return createBuilder().build();
95 }
96
97
98
99
100
101 public static CloseableHttpClient createSystem() {
102 return createBuilder().useSystemProperties().build();
103 }
104
105
106 }