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

package io.sentry.util;

import io.sentry.ISpan;
import io.sentry.protocol.Request;
import java.net.URI;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.ApiStatus;

@ApiStatus.Internal
public final class UrlUtils
{
    @NotNull
    public static final String SENSITIVE_DATA_SUBSTITUTE = "[Filtered]";
    
    @Nullable
    public static UrlDetails parseNullable(@Nullable final String url) {
        return (url == null) ? null : parse(url);
    }
    
    @NotNull
    public static UrlDetails parse(@NotNull final String url) {
        try {
            final URI uri = new URI(url);
            if (uri.isAbsolute() && !isValidAbsoluteUrl(uri)) {
                return new UrlDetails(null, null, null);
            }
            final String schemeAndSeparator = (uri.getScheme() == null) ? "" : (uri.getScheme() + "://");
            final String authority = (uri.getRawAuthority() == null) ? "" : uri.getRawAuthority();
            final String path = (uri.getRawPath() == null) ? "" : uri.getRawPath();
            final String query = uri.getRawQuery();
            final String fragment = uri.getRawFragment();
            final String filteredUrl = schemeAndSeparator + filterUserInfo(authority) + path;
            return new UrlDetails(filteredUrl, query, fragment);
        }
        catch (final Exception e) {
            return new UrlDetails(null, null, null);
        }
    }
    
    private static boolean isValidAbsoluteUrl(@NotNull final URI uri) {
        try {
            uri.toURL();
        }
        catch (final Exception e) {
            return false;
        }
        return true;
    }
    
    @NotNull
    private static String filterUserInfo(@NotNull final String url) {
        if (!url.contains("@")) {
            return url;
        }
        if (url.startsWith("@")) {
            return "[Filtered]" + url;
        }
        final String userInfo = url.substring(0, url.indexOf(64));
        final String filteredUserInfo = userInfo.contains(":") ? "[Filtered]:[Filtered]" : "[Filtered]";
        return filteredUserInfo + url.substring(url.indexOf(64));
    }
    
    public static final class UrlDetails
    {
        @Nullable
        private final String url;
        @Nullable
        private final String query;
        @Nullable
        private final String fragment;
        
        public UrlDetails(@Nullable final String url, @Nullable final String query, @Nullable final String fragment) {
            this.url = url;
            this.query = query;
            this.fragment = fragment;
        }
        
        @Nullable
        public String getUrl() {
            return this.url;
        }
        
        @NotNull
        public String getUrlOrFallback() {
            if (this.url == null) {
                return "unknown";
            }
            return this.url;
        }
        
        @Nullable
        public String getQuery() {
            return this.query;
        }
        
        @Nullable
        public String getFragment() {
            return this.fragment;
        }
        
        public void applyToRequest(@Nullable final Request request) {
            if (request == null) {
                return;
            }
            request.setUrl(this.url);
            request.setQueryString(this.query);
            request.setFragment(this.fragment);
        }
        
        public void applyToSpan(@Nullable final ISpan span) {
            if (span == null) {
                return;
            }
            if (this.query != null) {
                span.setData("http.query", this.query);
            }
            if (this.fragment != null) {
                span.setData("http.fragment", this.fragment);
            }
        }
    }
}
