title: How to access Microsoft Graph Java API from Java application behind a proxy server?
body: <p>I am using MS graph Java sdk in order to access O365 ODFB drives from my java application. 
  When I am by-passing the enterprise proxy server(connected to open internet) then I am able to get desired response from the APIs. But when I am connecting via proxy server, I am getting the following exception:</p>
  
  <pre><code>SEVERE: Throwable detail: com.microsoft.graph.core.ClientException: Error during http request
  Exception in thread "main" com.microsoft.graph.core.ClientException: Error during http request
      at com.microsoft.graph.http.DefaultHttpProvider.sendRequestInternal(DefaultHttpProvider.java:356)
      at com.microsoft.graph.http.DefaultHttpProvider.send(DefaultHttpProvider.java:197)
      at com.microsoft.graph.http.DefaultHttpProvider.send(DefaultHttpProvider.java:177)
      at com.microsoft.graph.http.BaseCollectionRequest.send(BaseCollectionRequest.java:87)
      at com.microsoft.graph.requests.generated.BaseDriveItemCollectionRequest.get(BaseDriveItemCollectionRequest.java:54)
      at com.example.TestMain.main(TestMain.java:148)
  Caused by: java.net.ConnectException: Connection timed out: connect
      at java.net.DualStackPlainSocketImpl.connect0(Native Method)
      at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
      at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
      at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
      at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
      at java.net.PlainSocketImpl.connect(Unknown Source)
      at java.net.SocksSocketImpl.connect(Unknown Source)
      at java.net.Socket.connect(Unknown Source)
      at sun.security.ssl.SSLSocketImpl.connect(Unknown Source)
      at sun.security.ssl.BaseSSLSocketImpl.connect(Unknown Source)
      at sun.net.NetworkClient.doConnect(Unknown Source)
      at sun.net.www.http.HttpClient.openServer(Unknown Source)
      at sun.net.www.http.HttpClient.openServer(Unknown Source)
      at sun.net.www.protocol.https.HttpsClient.&lt;init&gt;(Unknown Source)
      at sun.net.www.protocol.https.HttpsClient.New(Unknown Source)
      at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(Unknown Source)
      at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(Unknown Source)
      at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
      at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
      at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
      at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
      at java.net.HttpURLConnection.getResponseCode(Unknown Source)
      at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(Unknown Source)
      at com.microsoft.graph.http.UrlConnection.getResponseCode(UrlConnection.java:110)
      at com.microsoft.graph.http.DefaultHttpProvider.sendRequestInternal(DefaultHttpProvider.java:297)
  </code></pre>
  
  <p>The code that I am using to connect Graph API is as follows:</p>
  
  <pre><code>// Get an access token for the client
      Authenticator authenticator = new Authenticator();
      IAuthenticationProvider authenticationProvider = authenticator.getAuthenticationProvider();
  
      graphClient = GraphServiceClient
              .builder()
              .authenticationProvider(authenticationProvider)
              .buildClient();
  
      graphClient.getLogger().setLoggingLevel(LoggerLevel.DEBUG);
  </code></pre>
  
  <p>Getting error at this line:</p>
  
  <pre><code>DriveItem item = graphClient.users().byId("userPrincipalName")
          .drive()
          .root()
          .children()
          .buildRequest()
          .get()
          .getCurrentPage()
          .get(0);
  </code></pre>
  
  <p>I am able to get the bearer token by passing the proxy configuration to the <code>HttpURLConnection.openConnection(proxy)</code> method inside Authenticator class.</p>
  
  <p>e.g.:</p>
  
  <pre><code>Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("myproxyaddress", 80));
  @SuppressWarnings("restriction")
  String encoded = new sun.misc.BASE64Encoder().encodeBuffer(("username:password").getBytes()).replace("\r\n", "");
  URL url = new URL(tokenEndpoint);
  HttpURLConnection conn = (HttpURLConnection) url.openConnection(proxy);
  conn.setRequestProperty("Proxy-Authorization", "Basic " + encoded);
  </code></pre>
  
  <p>Am I missing out anything? Please help.</p>