/******************************************************************************* * Copyright (c) 2011 Subgraph. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Subgraph - initial API and implementation ******************************************************************************/ package com.subgraph.vega.impl.scanner.handlers; import org.apache.http.client.methods.HttpUriRequest; import com.subgraph.vega.api.http.requests.IHttpResponse; import com.subgraph.vega.api.http.requests.IPageFingerprint; import com.subgraph.vega.api.scanner.IInjectionModuleContext; import com.subgraph.vega.api.scanner.IPathState; public class PageVariabilityCheck extends CrawlerModule { private final static int BH_CHECKS = 15; private final InjectionChecks injectionChecks; public PageVariabilityCheck(InjectionChecks injectionChecks) { this.injectionChecks = injectionChecks; } @Override public void initialize(IPathState ps) { final IInjectionModuleContext ctx = ps.createModuleContext(); for(int i = 0; i < BH_CHECKS; i++) { ctx.submitRequest(ps.createRequest(), this, i); } } @Override public void runModule(HttpUriRequest request, IHttpResponse response, IInjectionModuleContext ctx) { final IPathState ps = ctx.getPathState(); if(response.isFetchFail()) ctx.error(request, response, "Failed to fetch response during page variability check"); else testResponse(request, response, ctx); ctx.incrementResponseCount(); if(!ctx.allResponsesReceived()) return; if(ps.getResponseVaries()) return; injectionChecks.launchInjectionModules(ps); } private void testResponse(HttpUriRequest request, IHttpResponse response, IInjectionModuleContext ctx) { final IPageFingerprint fp = response.getPageFingerprint(); final IPathState ps = ctx.getPathState(); if(!ps.matchesPathFingerprint(fp)) { ps.setResponseVaries(); ctx.debug("Response varies"); } } }