package com.apigee.sdk.apm.android; import java.io.InputStream; import java.io.OutputStream; import java.net.ContentHandlerFactory; import java.net.FileNameMap; import java.net.HttpURLConnection; import java.security.Permission; import java.security.Principal; import java.security.cert.Certificate; import java.util.List; import java.util.Map; import java.util.UUID; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLPeerUnverifiedException; import javax.net.ssl.SSLSocketFactory; /** * @y.exclude */ public class ApigeeHttpsURLConnection extends HttpsURLConnection { private HttpsURLConnection realConnection; private long startTimeMillis; public ApigeeHttpsURLConnection(HttpsURLConnection connection) { super(connection.getURL()); realConnection = connection; } public void disconnect() { long endTimeMillis = System.currentTimeMillis(); java.net.URL url = realConnection.getURL(); String urlAsString = url.toString(); realConnection.disconnect(); boolean errorOccurred = false; ApigeeMonitoringClient monitoringClient = ApigeeMonitoringClient.getInstance(); if( (monitoringClient != null) && monitoringClient.isInitialized() ) { Map<String,Object> httpHeaders = HttpUrlConnectionUtils.captureHttpHeaders(this); NetworkMetricsCollectorService metricsCollectorService = monitoringClient.getMetricsCollectorService(); if( metricsCollectorService != null ) { metricsCollectorService.analyze(urlAsString, new Long(startTimeMillis), new Long(endTimeMillis), errorOccurred, httpHeaders); } } } public java.io.InputStream getErrorStream() { return realConnection.getErrorStream(); } public static boolean getFollowRedirects() { return HttpsURLConnection.getFollowRedirects(); } public boolean getInstanceFollowRedirects() { return realConnection.getInstanceFollowRedirects(); } public String getRequestMethod() { return realConnection.getRequestMethod(); } public int getResponseCode() throws java.io.IOException { return realConnection.getResponseCode(); } public String getResponseMessage() throws java.io.IOException { return realConnection.getResponseMessage(); } public void setChunkedStreamingMode(int chunkedLength) { realConnection.setChunkedStreamingMode(chunkedLength); } public void setFixedLengthStreamingMode(int contentLength) { realConnection.setFixedLengthStreamingMode(contentLength); } public static void setFollowRedirects(boolean auto) { HttpsURLConnection.setFollowRedirects(auto); } public void setInstanceFollowRedirects(boolean followRedirects) { realConnection.setInstanceFollowRedirects(followRedirects); } public void setRequestMethod(String method) throws java.net.ProtocolException { realConnection.setRequestMethod(method); } public boolean usingProxy() { return realConnection.usingProxy(); } public String getCipherSuite() { return realConnection.getCipherSuite(); } public static HostnameVerifier getDefaultHostnameVerifier() { return HttpsURLConnection.getDefaultHostnameVerifier(); } public static SSLSocketFactory getDefaultSSLSocketFactory() { return HttpsURLConnection.getDefaultSSLSocketFactory(); } public HostnameVerifier getHostnameVerifier() { return realConnection.getHostnameVerifier(); } public Certificate[] getLocalCertificates() { return realConnection.getLocalCertificates(); } public Principal getLocalPrincipal() { return realConnection.getLocalPrincipal(); } public Principal getPeerPrincipal() throws SSLPeerUnverifiedException { return realConnection.getPeerPrincipal(); } public SSLSocketFactory getSSLSocketFactory() { return realConnection.getSSLSocketFactory(); } public Certificate[] getServerCertificates() throws SSLPeerUnverifiedException { return realConnection.getServerCertificates(); } public static void setDefaultHostnameVerifier(HostnameVerifier v) { HttpsURLConnection.setDefaultHostnameVerifier(v); } public static void setDefaultSSLSocketFactory(SSLSocketFactory sf) { HttpsURLConnection.setDefaultSSLSocketFactory(sf); } public void setHostnameVerifier(HostnameVerifier v) { realConnection.setHostnameVerifier(v); } public void setSSLSocketFactory(SSLSocketFactory sf) { realConnection.setSSLSocketFactory(sf); } //********************************************************** public void addRequestProperty(String field, String newValue) { realConnection.addRequestProperty(field, newValue); } public void connect() throws java.io.IOException { startTimeMillis = System.currentTimeMillis(); ApigeeMonitoringClient monitoringClient = ApigeeMonitoringClient.getInstance(); if (monitoringClient != null ) { if (monitoringClient.getAppIdentification() != null) { realConnection.setRequestProperty("X-Apigee-Client-Org-Name", monitoringClient.getAppIdentification().getOrganizationId()); realConnection.setRequestProperty("X-Apigee-Client-App-Name", monitoringClient.getAppIdentification().getApplicationId()); } realConnection.setRequestProperty("X-Apigee-Device-Id", monitoringClient.getApigeeDeviceId()); if (monitoringClient.getSessionManager() != null) realConnection.setRequestProperty("X-Apigee-Session-Id", monitoringClient.getSessionManager().getSessionUUID()); realConnection.setRequestProperty("X-Apigee-Client-Request-Id", UUID.randomUUID().toString()); } realConnection.connect(); } public boolean getAllowUserInteraction() { return realConnection.getAllowUserInteraction(); } public int getConnectTimeout() { return realConnection.getConnectTimeout(); } public Object getContent() throws java.io.IOException { return realConnection.getContent(); } public Object getContent(Class[] types) throws java.io.IOException { return realConnection.getContent(types); } public String getContentEncoding() { return realConnection.getContentEncoding(); } public int getContentLength() { return realConnection.getContentLength(); } public String getContentType() { return realConnection.getContentType(); } public long getDate() { return realConnection.getDate(); } public static boolean getDefaultAllowUserInteraction() { return HttpURLConnection.getDefaultAllowUserInteraction(); } public static String getDefaultRequestProperty(String field) { return HttpURLConnection.getDefaultRequestProperty(field); } public boolean getDefaultUseCaches() { return realConnection.getDefaultUseCaches(); } public boolean getDoInput() { return realConnection.getDoInput(); } public boolean getDoOutput() { return realConnection.getDoOutput(); } public long getExpiration() { return realConnection.getExpiration(); } public static FileNameMap getFileNameMap() { return HttpURLConnection.getFileNameMap(); } public String getHeaderField(String key) { return realConnection.getHeaderField(key); } public String getHeaderField(int pos) { return realConnection.getHeaderField(pos); } public long getHeaderFieldDate(String field, long defaultValue) { return realConnection.getHeaderFieldDate(field, defaultValue); } public int getHeaderFieldInt(String field, int defaultValue) { return realConnection.getHeaderFieldInt(field,defaultValue); } public String getHeaderFieldKey(int posn) { return realConnection.getHeaderFieldKey(posn); } public Map<String,List<String>> getHeaderFields() { return realConnection.getHeaderFields(); } public long getIfModifiedSince() { return realConnection.getIfModifiedSince(); } public InputStream getInputStream() throws java.io.IOException { return realConnection.getInputStream(); } public long getLastModified() { return realConnection.getLastModified(); } public OutputStream getOutputStream() throws java.io.IOException { return realConnection.getOutputStream(); } public Permission getPermission() throws java.io.IOException { return realConnection.getPermission(); } public int getReadTimeout() { return realConnection.getReadTimeout(); } public Map<String,List<String>> getRequestProperties() { return realConnection.getRequestProperties(); } public String getRequestProperty(String field) { return realConnection.getRequestProperty(field); } public java.net.URL getURL() { return realConnection.getURL(); } public boolean getUseCaches() { return realConnection.getUseCaches(); } public static String guessContentTypeFromName(String url) { return HttpURLConnection.guessContentTypeFromName(url); } public static String guessContentTypeFromStream(InputStream is) throws java.io.IOException { return HttpURLConnection.guessContentTypeFromStream(is); } public void setAllowUserInteraction(boolean newValue) { realConnection.setAllowUserInteraction(newValue); } public void setConnectTimeout(int timeoutMillis) { realConnection.setConnectTimeout(timeoutMillis); } public synchronized static void setContentHandlerFactory(ContentHandlerFactory contentFactory) { HttpURLConnection.setContentHandlerFactory(contentFactory); } public static void setDefaultAllowUserInteraction(boolean allows) { HttpURLConnection.setDefaultAllowUserInteraction(allows); } public static void setDefaultRequestProperty(String field, String value) { HttpURLConnection.setDefaultRequestProperty(field, value); } public void setDefaultUseCaches(boolean newValue) { realConnection.setDefaultUseCaches(newValue); } public void setDoInput(boolean newValue) { realConnection.setDoInput(newValue); } public void setDoOutput(boolean newValue) { realConnection.setDoOutput(newValue); } public static void setFileNameMap(FileNameMap map) { HttpURLConnection.setFileNameMap(map); } public void setIfModifiedSince(long newValue) { realConnection.setIfModifiedSince(newValue); } public void setReadTimeout(int timeoutMillis) { realConnection.setReadTimeout(timeoutMillis); } public void setRequestProperty(String field, String newValue) { realConnection.setRequestProperty(field, newValue); } public void setUseCaches(boolean newValue) { realConnection.setUseCaches(newValue); } public String toString() { return realConnection.toString(); } }