// 
// Decompiled by Procyon v0.6.0
// 

package io.sentry.util.network;

import org.jetbrains.annotations.VisibleForTesting;
import java.util.Set;
import java.util.Locale;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Iterator;
import java.util.List;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.NotNull;

public final class NetworkDetailCaptureUtils
{
    private NetworkDetailCaptureUtils() {
    }
    
    @Nullable
    public static NetworkRequestData initializeForUrl(@NotNull final String url, @Nullable final String method, @Nullable final List<String> networkDetailAllowUrls, @Nullable final List<String> networkDetailDenyUrls) {
        if (!shouldCaptureUrl(url, networkDetailAllowUrls, networkDetailDenyUrls)) {
            return null;
        }
        return new NetworkRequestData(method);
    }
    
    @NotNull
    public static <T> ReplayNetworkRequestOrResponse createRequest(@NotNull final T httpObject, @Nullable final Long bodySize, final boolean networkCaptureBodies, @NotNull final NetworkBodyExtractor<T> bodyExtractor, @NotNull final List<String> networkRequestHeaders, @NotNull final NetworkHeaderExtractor<T> headerExtractor) {
        return createRequestOrResponseInternal(httpObject, bodySize, networkCaptureBodies, (NetworkBodyExtractor<Object>)bodyExtractor, networkRequestHeaders, (NetworkHeaderExtractor<Object>)headerExtractor);
    }
    
    @NotNull
    public static <T> ReplayNetworkRequestOrResponse createResponse(@NotNull final T httpObject, @Nullable final Long bodySize, final boolean networkCaptureBodies, @NotNull final NetworkBodyExtractor<T> bodyExtractor, @NotNull final List<String> networkResponseHeaders, @NotNull final NetworkHeaderExtractor<T> headerExtractor) {
        return createRequestOrResponseInternal(httpObject, bodySize, networkCaptureBodies, (NetworkBodyExtractor<Object>)bodyExtractor, networkResponseHeaders, (NetworkHeaderExtractor<Object>)headerExtractor);
    }
    
    private static boolean shouldCaptureUrl(@NotNull final String url, @Nullable final List<String> networkDetailAllowUrls, @Nullable final List<String> networkDetailDenyUrls) {
        if (networkDetailDenyUrls != null) {
            for (final String pattern : networkDetailDenyUrls) {
                if (pattern != null && url.matches(pattern)) {
                    return false;
                }
            }
        }
        if (networkDetailAllowUrls == null) {
            return false;
        }
        for (final String pattern : networkDetailAllowUrls) {
            if (pattern != null && url.matches(pattern)) {
                return true;
            }
        }
        return false;
    }
    
    @VisibleForTesting
    @NotNull
    static Map<String, String> getCaptureHeaders(@Nullable final Map<String, String> allHeaders, @NotNull final List<String> allowedHeaders) {
        final Map<String, String> capturedHeaders = new LinkedHashMap<String, String>();
        if (allHeaders == null) {
            return capturedHeaders;
        }
        final Set<String> normalizedAllowed = new HashSet<String>();
        for (final String header : allowedHeaders) {
            if (header != null) {
                normalizedAllowed.add(header.toLowerCase(Locale.ROOT));
            }
        }
        for (final Map.Entry<String, String> entry : allHeaders.entrySet()) {
            if (normalizedAllowed.contains(entry.getKey().toLowerCase(Locale.ROOT))) {
                capturedHeaders.put(entry.getKey(), entry.getValue());
            }
        }
        return capturedHeaders;
    }
    
    @NotNull
    private static <T> ReplayNetworkRequestOrResponse createRequestOrResponseInternal(@NotNull final T httpObject, @Nullable final Long bodySize, final boolean networkCaptureBodies, @NotNull final NetworkBodyExtractor<T> bodyExtractor, @NotNull final List<String> allowedHeaders, @NotNull final NetworkHeaderExtractor<T> headerExtractor) {
        NetworkBody body = null;
        if (networkCaptureBodies) {
            body = bodyExtractor.extract(httpObject);
        }
        final Map<String, String> headers = getCaptureHeaders(headerExtractor.extract(httpObject), allowedHeaders);
        return new ReplayNetworkRequestOrResponse(bodySize, body, headers);
    }
    
    public interface NetworkBodyExtractor<T>
    {
        @Nullable
        NetworkBody extract(@NotNull final T p0);
    }
    
    public interface NetworkHeaderExtractor<T>
    {
        @NotNull
        Map<String, String> extract(@NotNull final T p0);
    }
}
