package com.mopub.mobileads.util.vast;
import android.net.http.AndroidHttpClient;
import android.os.AsyncTask;
import com.mopub.common.HttpClient;
import com.mopub.common.logging.MoPubLog;
import com.mopub.common.util.Strings;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
public class VastXmlManagerAggregator extends AsyncTask<String, Void, List<VastXmlManager>> {
interface VastXmlManagerAggregatorListener {
void onAggregationComplete(final List<VastXmlManager> vastXmlManagers);
}
// More than reasonable number of nested VAST urls to follow
static final int MAX_TIMES_TO_FOLLOW_VAST_REDIRECT = 20;
private final WeakReference<VastXmlManagerAggregatorListener> mVastXmlManagerAggregatorListener;
private int mTimesFollowedVastRedirect;
VastXmlManagerAggregator(final VastXmlManagerAggregatorListener vastXmlManagerAggregatorListener) {
super();
mVastXmlManagerAggregatorListener =
new WeakReference<VastXmlManagerAggregatorListener>(vastXmlManagerAggregatorListener);
}
@Override
protected List<VastXmlManager> doInBackground(String... strings) {
List<VastXmlManager> vastXmlManagers = null;
AndroidHttpClient httpClient = null;
try {
httpClient = HttpClient.getHttpClient();
if (strings != null && strings.length > 0) {
String vastXml = strings[0];
vastXmlManagers = new ArrayList<VastXmlManager>();
while (vastXml != null && vastXml.length() > 0 && !isCancelled()) {
final VastXmlManager xmlManager = new VastXmlManager();
xmlManager.parseVastXml(vastXml);
vastXmlManagers.add(xmlManager);
vastXml = followVastRedirect(httpClient, xmlManager.getVastAdTagURI());
}
}
} catch (Exception e) {
MoPubLog.d("Failed to parse VAST XML", e);
} finally {
if (httpClient != null) {
httpClient.close();
}
}
return vastXmlManagers;
}
@Override
protected void onPostExecute(final List<VastXmlManager> vastXmlManagers) {
final VastXmlManagerAggregatorListener listener = mVastXmlManagerAggregatorListener.get();
if (listener != null) {
listener.onAggregationComplete(vastXmlManagers);
}
}
@Override
protected void onCancelled() {
final VastXmlManagerAggregatorListener listener = mVastXmlManagerAggregatorListener.get();
if (listener != null) {
listener.onAggregationComplete(null);
}
}
String followVastRedirect(final AndroidHttpClient httpClient, final String redirectUrl) throws Exception {
if (redirectUrl != null && mTimesFollowedVastRedirect < MAX_TIMES_TO_FOLLOW_VAST_REDIRECT) {
mTimesFollowedVastRedirect++;
final HttpGet httpget = HttpClient.initializeHttpGet(redirectUrl);
final HttpResponse response = httpClient.execute(httpget);
final HttpEntity entity = response.getEntity();
return (entity != null) ? Strings.fromStream(entity.getContent()) : null;
}
return null;
}
@Deprecated
void setTimesFollowedVastRedirect(final int timesFollowedVastRedirect) {
mTimesFollowedVastRedirect = timesFollowedVastRedirect;
}
}