blob: fc87a6797c0b5f344ef5c5e5d74af8e641664f36 [file] [log] [blame]
/**
* 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 org.apache.weex.bridge;
import static org.apache.weex.http.WXHttpUtil.KEY_USER_AGENT;
import android.net.Uri;
import android.support.annotation.Keep;
import android.text.TextUtils;
import org.apache.weex.WXEnvironment;
import org.apache.weex.WXHttpListener;
import org.apache.weex.WXSDKInstance;
import org.apache.weex.WXSDKManager;
import org.apache.weex.adapter.IWXHttpAdapter;
import org.apache.weex.adapter.URIAdapter;
import org.apache.weex.base.CalledByNative;
import org.apache.weex.bridge.WXBridgeManager.BundType;
import org.apache.weex.common.WXErrorCode;
import org.apache.weex.common.WXRequest;
import org.apache.weex.common.WXResponse;
import org.apache.weex.http.WXHttpUtil;
import org.apache.weex.utils.WXExceptionUtils;
import org.apache.weex.utils.WXLogUtils;
import java.util.HashMap;
import java.util.Locale;
public class RequestHandler {
@Keep
native void nativeInvokeOnSuccess(long callback, String script, String bundleType);
native void nativeInvokeOnFailed(long callback);
@CalledByNative
public static RequestHandler create() {
return new RequestHandler();
}
@CalledByNative
public void send(String instanceId, String url, long nativeCallback) {
if (TextUtils.isEmpty(instanceId) || TextUtils.isEmpty(url) ||
nativeCallback == 0 ||
!WXSDKManager.getInstance().getAllInstanceMap().containsKey(
instanceId)) {
return;
}
WXSDKManager manager = WXSDKManager.getInstance();
WXSDKInstance instance =
WXSDKManager.getInstance().getSDKInstance(instanceId);
if (instance == null)
return;
IWXHttpAdapter adapter = WXSDKManager.getInstance().getIWXHttpAdapter();
WXRequest wxRequest = new WXRequest();
wxRequest.url = manager.getURIAdapter()
.rewrite(instance, URIAdapter.BUNDLE, Uri.parse(url))
.toString();
if (wxRequest.paramMap == null) {
wxRequest.paramMap = new HashMap<>();
}
wxRequest.paramMap.put(
KEY_USER_AGENT, WXHttpUtil.assembleUserAgent(
instance.getContext(), WXEnvironment.getConfig()));
wxRequest.paramMap.put("isBundleRequest", "true");
WXLogUtils.i("Eagle", String.format(Locale.ENGLISH, "Weex eagle is going to download script from %s", url));
adapter.sendRequest(wxRequest, new OnHttpListenerInner(instance, nativeCallback, url));
}
@Keep
@CalledByNative
public void getBundleType(String instanceId, final String content, final long nativeCallback){
BundType bundleType = WXBridgeManager.getInstance().getBundleType("", content);
final String bundleTypeStr = bundleType == null ? "Others" : bundleType.toString();
WXSDKInstance instance = WXSDKManager.getInstance().getSDKInstance(instanceId);
if ("Others".equalsIgnoreCase(bundleTypeStr) && null != instance){
WXExceptionUtils.commitCriticalExceptionRT(
instanceId,
WXErrorCode.WX_KEY_EXCEPTION_NO_BUNDLE_TYPE,
"RequestHandler.onSuccess",
"eagle ->" +WXErrorCode.WX_KEY_EXCEPTION_NO_BUNDLE_TYPE.getErrorMsg(),
null
);
}
WXBridgeManager.getInstance().post(new Runnable() {
@Override
public void run() {
if(WXBridgeManager.getInstance().isJSFrameworkInit()) {
nativeInvokeOnSuccess(nativeCallback, content, bundleTypeStr);
}
else {
nativeInvokeOnFailed(nativeCallback);
}
}
});
}
class OnHttpListenerInner extends WXHttpListener {
private long sNativeCallback;
OnHttpListenerInner(WXSDKInstance instance, long nativeCallback, String bundlUrl) {
super(instance, bundlUrl);
sNativeCallback = nativeCallback;
}
@Override
public void onSuccess(WXResponse response) {
final String script = new String(response.originalData);
BundType bundleType = WXBridgeManager.getInstance().getBundleType("", script);
final String bundleTypeStr = bundleType == null ? "Others" : bundleType.toString();
if ("Others".equalsIgnoreCase(bundleTypeStr) && null != getInstance()){
WXExceptionUtils.commitCriticalExceptionRT(
getInstance().getInstanceId(),
WXErrorCode.WX_KEY_EXCEPTION_NO_BUNDLE_TYPE,
"RequestHandler.onSuccess",
"eagle ->" +WXErrorCode.WX_KEY_EXCEPTION_NO_BUNDLE_TYPE.getErrorMsg(),
null
);
}
WXBridgeManager.getInstance().post(new Runnable() {
@Override
public void run() {
if(WXBridgeManager.getInstance().isJSFrameworkInit()) {
nativeInvokeOnSuccess(sNativeCallback, script, bundleTypeStr);
}
else{
nativeInvokeOnFailed(sNativeCallback);
}
}
});
}
@Override
public void onFail(WXResponse response) {
nativeInvokeOnFailed(sNativeCallback);
}
}
}