/*
* Copyright (c) LinkedIn Corporation. All rights reserved. Licensed under the BSD-2 Clause license.
* See LICENSE in the project root for license information.
*/
package com.linkedin.flashback.matchrules;
import com.linkedin.flashback.http.HttpUtilities;
import com.linkedin.flashback.serializable.RecordedHttpRequest;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.log4j.Logger;
/**
* Match rule to match Http uri
* @author shfeng
*/
public class MatchUri extends BaseMatchRule {
private static final String MODULE = MatchUri.class.getName();
private static final Logger LOGGER = Logger.getLogger(MODULE);
@Override
public boolean test(RecordedHttpRequest incomingRequest, RecordedHttpRequest expectedRequest) {
return testUriEquivalency(incomingRequest.getUri(), expectedRequest.getUri());
}
@Override
public String getMatchFailureDescriptionForRequests(RecordedHttpRequest incomingRequest, RecordedHttpRequest expectedRequest) {
return String.format("URI Mismatch%nIncoming URI: %s%nExpected URI: %s%n",
incomingRequest.getUri(),
expectedRequest.getUri());
}
protected boolean testUriEquivalency(URI incomingUri, URI expectedUri) {
try {
URI incomingCanonicalizedUri = getCanonicalizedUri(incomingUri);
URI expectedCanonicalizedUri = getCanonicalizedUri(expectedUri);
return incomingCanonicalizedUri.equals(expectedCanonicalizedUri);
} catch (URISyntaxException e) {
LOGGER.error("Caught exception " + e + " while constructing modified URI");
}
return incomingUri.equals(expectedUri);
}
private int getPortForScheme(String scheme) {
if (HttpUtilities.HTTP_SCHEME.equalsIgnoreCase(scheme)) {
return HttpUtilities.HTTP_DEFAULT_PORT;
} else if (HttpUtilities.HTTPS_SCHEME.equalsIgnoreCase(scheme)) {
return HttpUtilities.HTTPS_DEFAULT_PORT;
}
return -1;
}
/**
* Returns a canonicalized version of the Uri, accounting for the default port for the scheme
* @param uri
* @return a canonicalized URI with the default port for the scheme (http or https) explicitly added if no port is specified
* @throws java.net.URISyntaxException
*/
private URI getCanonicalizedUri(URI uri)
throws URISyntaxException {
int defaultPort = getPortForScheme(uri.getScheme());
if (uri.getPort() == -1 && defaultPort != -1) {
return new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), defaultPort, uri.getPath(), uri.getQuery(), uri.getFragment());
}
return uri;
}
}