Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Question: Why PackageName is "com.android.okhttp" not "com.squareup.okhttp"? #2201

Closed
Guang1234567 opened this issue Jan 6, 2016 · 6 comments

Comments

@Guang1234567
Copy link

Hello @swankjesse

Q1

I have a problem that how android 5.1 integration with Okhttp?

I can not find com.android.okhttp.internal.http.HttpURLConnectionImpl in android aosp5.11 (http://androidxref.com/),

but find com.squareup.okhttp.internal.huc.HttpURLConnectionImpl


Q2

Can i pass my custom URLStreamHandler impl to

java.net.URL#URL(java.net.URL, java.lang.String,  java.net.URLStreamHandler)

in order to insteading of the internal-okhttp-moudle in android aosp 5.1?
Because i want avoid some bug in special brand devices.

my coustom URLStreamHandler impl :

/*
 *  Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You under the Apache License, Version 2.0
 *  (the "License"); you may not use this file except in compliance with
 *  the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

package com.squareup.okhttp;

import libcore.net.NetworkSecurityPolicy;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.Proxy;
import java.net.ResponseCache;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandler;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;

public class HttpHandler extends URLStreamHandler {

    private final static List<ConnectionSpec> CLEARTEXT_ONLY =
        Collections.singletonList(ConnectionSpec.CLEARTEXT);

    private final ConfigAwareConnectionPool configAwareConnectionPool =
            ConfigAwareConnectionPool.getInstance();

    @Override protected URLConnection openConnection(URL url) throws IOException {
        return newOkUrlFactory(null /* proxy */).open(url);
    }

    @Override protected URLConnection openConnection(URL url, Proxy proxy) throws IOException {
        if (url == null || proxy == null) {
            throw new IllegalArgumentException("url == null || proxy == null");
        }
        return newOkUrlFactory(proxy).open(url);
    }

    @Override protected int getDefaultPort() {
        return 80;
    }

    protected OkUrlFactory newOkUrlFactory(Proxy proxy) {
        OkUrlFactory okUrlFactory = createHttpOkUrlFactory(proxy);
        // For HttpURLConnections created through java.net.URL Android uses a connection pool that
        // is aware when the default network changes so that pooled connections are not re-used when
        // the default network changes.
        okUrlFactory.client().setConnectionPool(configAwareConnectionPool.get());
        return okUrlFactory;
    }

    /**
     * Creates an OkHttpClient suitable for creating {@link java.net.HttpURLConnection} instances on
     * Android.
     */
    // Visible for android.net.Network.
    public static OkUrlFactory createHttpOkUrlFactory(Proxy proxy) {
        OkHttpClient client = new OkHttpClient();

        // Explicitly set the timeouts to infinity.
        client.setConnectTimeout(0, TimeUnit.MILLISECONDS);
        client.setReadTimeout(0, TimeUnit.MILLISECONDS);
        client.setWriteTimeout(0, TimeUnit.MILLISECONDS);

        // Set the default (same protocol) redirect behavior. The default can be overridden for
        // each instance using HttpURLConnection.setInstanceFollowRedirects().
        client.setFollowRedirects(HttpURLConnection.getFollowRedirects());

        // Do not permit http -> https and https -> http redirects.
        client.setFollowSslRedirects(false);

        if (NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted()) {
          // Permit cleartext traffic only (this is a handler for HTTP, not for HTTPS).
          client.setConnectionSpecs(CLEARTEXT_ONLY);
        } else {
          // Cleartext HTTP denied by policy. Make okhttp deny cleartext HTTP attempts using the
          // only mechanism it currently provides -- pretend there are no suitable routes.
          client.setConnectionSpecs(Collections.<ConnectionSpec>emptyList());
        }

        // When we do not set the Proxy explicitly OkHttp picks up a ProxySelector using
        // ProxySelector.getDefault().
        if (proxy != null) {
            client.setProxy(proxy);
        }

        // OkHttp requires that we explicitly set the response cache.
        OkUrlFactory okUrlFactory = new OkUrlFactory(client);
        ResponseCache responseCache = ResponseCache.getDefault();
        if (responseCache != null) {
            AndroidInternal.setResponseCache(okUrlFactory, responseCache);
        }
        return okUrlFactory;
    }

}
@JakeWharton
Copy link
Member

I can not find *com.android.okhttp.internal.http.HttpURLConnectionImpl * in android aosp5.11 (http://androidxref.com/),

but find *com.squareup.okhttp.internal.huc.HttpURLConnectionImpl *

OkHttp in Android is here: https://android.googlesource.com/platform/external/okhttp/+/master. The reason the package name is com.android.okhttp is because there are jarjar rules which repackage it under that name.

@Guang1234567
Copy link
Author

@JakeWharton
thanks a lot.

How about question 2?

@JakeWharton
Copy link
Member

It seems related to Android and the java.net package, not this OkHttp
standalone library, which should be asked on StackOverflow or filed on
http://b.android.com.

On Wed, Jan 6, 2016, 2:33 AM LiHanGuang notifications@github.com wrote:

@JakeWharton https://github.com/JakeWharton
thanks a lot.

How about question 2?


Reply to this email directly or view it on GitHub
#2201 (comment).

@Guang1234567
Copy link
Author

Ok.

Insteading of the internal-okhttp-moudle for special brand devices.

Maybe can refer to
https://android-review.googlesource.com/#/c/54970/2/luni/src/main/java/java/net/URL.java

@dereky7
Copy link

dereky7 commented May 30, 2016

it use jarjar-rules.txt to repackage

@beaumontk
Copy link

I cloned: https://android.googlesource.com/platform/external/okhttp/
How do I build okhttp.jar for Android? mvn, ndk-build, other?
mvn gives errors. ndk-build looks for jni dir and needs Application.mk
Please explain.
KB

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants