Android Open Source - utwitterapi Http Client Modify Request Callback






From Project

Back to project page utwitterapi.

License

The source code is released under:

GNU General Public License

If you think the Android project utwitterapi listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package org.mariotaku.utwitterapi.hook;
/*from www  . ja va2  s .  c  o  m*/
import java.lang.reflect.InvocationTargetException;
import java.net.URI;
import java.net.URISyntaxException;

import org.apache.http.HttpHost;
import org.apache.http.HttpRequest;
import org.apache.http.ProtocolException;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.client.RequestWrapper;
import org.mariotaku.utwitterapi.Constants;
import org.mariotaku.utwitterapi.util.Utils;
import org.mariotaku.utwitterapi.util.XposedPluginUtils;

import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
import de.robv.android.xposed.XC_MethodReplacement;
import de.robv.android.xposed.XSharedPreferences;
import de.robv.android.xposed.XposedBridge;

public final class HttpClientModifyRequestCallback extends XC_MethodReplacement implements Constants {

  @Override
  protected Object replaceHookedMethod(final MethodHookParam param) throws Throwable {
    final Object[] args = param.args;
    processArguments(args);
    try {
      return XposedBridge.invokeOriginalMethod(param.method, param.thisObject, args);
    } catch (final InvocationTargetException e) {
      final Throwable cause = e.getCause();
      if (cause != null) throw cause;
      throw e;
    }
  }

  private static int indexOfHttpHost(final Object[] args) {
    if (args == null) return -1;
    for (int i = 0, j = args.length; i < j; i++) {
      if (args[i] instanceof HttpHost) return i;
    }
    return -1;
  }

  private static int indexOfHttpRequest(final Object[] args) {
    if (args == null) return -1;
    for (int i = 0, j = args.length; i < j; i++) {
      if (args[i] instanceof HttpRequest) return i;
    }
    return -1;
  }

  private static int indexOfHttpUriRequest(final Object[] args) {
    if (args == null) return -1;
    for (int i = 0, j = args.length; i < j; i++) {
      if (args[i] instanceof HttpUriRequest) return i;
    }
    return -1;
  }

  private static void modifyAbstractHttpMessage(final HttpRequestBase req) throws URISyntaxException {
    final URI origURI = req.getURI();
    final String origUriString = origURI.toString();
    if (!Utils.isTwitterAPI(origUriString) || !XposedPluginUtils.isUsingCustomAPI()) return;
    final String replacedUriString = XposedPluginUtils.replaceAPIUri(origUriString);
    final String hostHeaderValue = XposedPluginUtils.getCustomAPIHostHeader(origUriString);
    req.setURI(new URI(replacedUriString));
    if (!TextUtils.isEmpty(hostHeaderValue)) {
      req.setHeader("Host", hostHeaderValue);
    }
  }

  private static void processArguments(final Object[] args) throws URISyntaxException, ProtocolException {
    if (args == null) return;
    final int indexOfHttpUriRequest = indexOfHttpUriRequest(args);
    final int indexOfHttpHost = indexOfHttpHost(args);
    final int indexOfHttpRequest = indexOfHttpRequest(args);
    if (indexOfHttpUriRequest != -1) {
      final HttpUriRequest req = (HttpUriRequest) args[indexOfHttpUriRequest];
      final URI uri = req.getURI();
      if (Utils.isTwitterAPIHost(uri.getHost())) {
        if (Utils.isDebugBuild()) {
          Log.d(LOGTAG, String.format("Modifying HTTP request for %s", uri));
        }
        if (req instanceof HttpRequestBase) {
          modifyAbstractHttpMessage((HttpRequestBase) req);
        } else {
          final XSharedPreferences prefs = new XSharedPreferences(PACKAGE_NAME,
              SHARED_PREFERENCE_NAME_PREFERENCES);
          final String apiAddress = prefs.getString(KEY_API_ADDRESS, null);
          final String ipAddress = prefs.getString(KEY_IP_ADDRESS, null);
          final Uri.Builder uriBuilder = Uri.parse(uri.toString()).buildUpon();
          if (!TextUtils.isEmpty(ipAddress)) {
            uriBuilder.authority(ipAddress);
          } else if (!TextUtils.isEmpty(apiAddress)) {
            uriBuilder.authority(apiAddress);
          }
          final String uriString = uriBuilder.build().toString();
          final RequestWrapper wrapper = new RequestWrapper(req);
          wrapper.setMethod(req.getMethod());
          wrapper.setHeaders(req.getAllHeaders());
          wrapper.setParams(req.getParams());
          wrapper.setProtocolVersion(req.getProtocolVersion());
          wrapper.setURI(new URI(uriString));
          if (!TextUtils.isEmpty(apiAddress)) {
            wrapper.setHeader("Host", apiAddress);
          }
          args[indexOfHttpUriRequest] = wrapper;
        }
      }
    } else if (indexOfHttpHost != -1 && indexOfHttpRequest != -1) {
      final HttpHost host = (HttpHost) args[indexOfHttpHost];
      final HttpRequest req = (HttpRequest) args[indexOfHttpRequest];
      if (Utils.isTwitterAPIHost(host.getHostName())) {
        if (Utils.isDebugBuild()) {
          Log.d(LOGTAG, String.format("Modifying HTTP request for %s %s", host, req));
        }
        final XSharedPreferences prefs = new XSharedPreferences(PACKAGE_NAME,
            SHARED_PREFERENCE_NAME_PREFERENCES);
        final String apiAddress = prefs.getString(KEY_API_ADDRESS, null);
        final String ipAddress = prefs.getString(KEY_IP_ADDRESS, null);
        if (!TextUtils.isEmpty(ipAddress)) {
          args[indexOfHttpHost] = new HttpHost(ipAddress, host.getPort(), host.getSchemeName());
        } else if (!TextUtils.isEmpty(apiAddress)) {
          args[indexOfHttpHost] = new HttpHost(apiAddress, host.getPort(), host.getSchemeName());
        }
        req.setHeader("Host", apiAddress);
      }
    }
  }

}




Java Source Code List

org.mariotaku.utwitterapi.Constants.java
org.mariotaku.utwitterapi.UTwitterAPIPlugin.java
org.mariotaku.utwitterapi.activity.BrowserSigninAgentActivity.java
org.mariotaku.utwitterapi.activity.PinCodeActivity.java
org.mariotaku.utwitterapi.activity.PluginSettingsActivity.java
org.mariotaku.utwitterapi.adapter.ApplicationsListAdapter.java
org.mariotaku.utwitterapi.fragment.AddApplicationDialogFragmnt.java
org.mariotaku.utwitterapi.fragment.EditAPIDialogFragment.java
org.mariotaku.utwitterapi.fragment.ProgressDialogFragment.java
org.mariotaku.utwitterapi.fragment.ProxiedClientsListFragment.java
org.mariotaku.utwitterapi.fragment.XposedNotAvailableDialogFragment.java
org.mariotaku.utwitterapi.hook.ApacheSSLSocketFactoryHook.java
org.mariotaku.utwitterapi.hook.HttpClientModifyRequestCallback.java
org.mariotaku.utwitterapi.hook.HttpsURLConnectionSetHostnameVerifierCallback.java
org.mariotaku.utwitterapi.hook.HttpsURLConnectionSetSSLSocketFactoryCallback.java
org.mariotaku.utwitterapi.hook.OkHttpClientModifyRequestCallback.java
org.mariotaku.utwitterapi.hook.SchemeGetSocketFactoryCallback.java
org.mariotaku.utwitterapi.hook.Twitter4JFixURLCallback.java
org.mariotaku.utwitterapi.hook.Twitter4JForceHttpsCallback.java
org.mariotaku.utwitterapi.hook.URLConnectionModifyRequestCallback.java
org.mariotaku.utwitterapi.loader.AbsApplicationsLoader.java
org.mariotaku.utwitterapi.loader.ApplicationsLoader.java
org.mariotaku.utwitterapi.loader.ProxiedApplicationsLoader.java
org.mariotaku.utwitterapi.util.AllowAllHostnameVerifierImpl.java
org.mariotaku.utwitterapi.util.OAuthPasswordAuthenticator.java
org.mariotaku.utwitterapi.util.TrustAllApacheSSLSocketFactory.java
org.mariotaku.utwitterapi.util.TrustAllSSLSocketFactory.java
org.mariotaku.utwitterapi.util.TrustAllX509TrustManager.java
org.mariotaku.utwitterapi.util.Utils.java
org.mariotaku.utwitterapi.util.XposedPluginUtils.java