/* * Copyright 2010 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.jstestdriver.server.handlers; import static com.google.jstestdriver.runner.RunnerType.CLIENT; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.inject.Inject; import com.google.jstestdriver.SlaveBrowser; import com.google.jstestdriver.UserAgentParser; import com.google.jstestdriver.browser.BrowserHunter; import com.google.jstestdriver.requesthandlers.RequestHandler; import com.google.jstestdriver.runner.RunnerType; import com.google.jstestdriver.server.handlers.pages.SlavePageRequest; import com.google.jstestdriver.util.ParameterParser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.Map; import java.util.Set; import javax.servlet.http.HttpServletResponse; /** * "Captures" a browser by redirecting it to RemoteConsoleRunner url, and adds * it to the CapturedBrowsers collection. * * @author jeremiele@google.com (Jeremie Lenfant-Engelmann) */ // TODO(corysmith): refactor the concerns in the handler. It's doing to much again. public class CaptureHandler implements RequestHandler { private static final Logger logger = LoggerFactory.getLogger(CaptureHandler.class); public static final String RUNNER_TYPE = "rt"; private static final String TIMEOUT = "timeout"; public static final String STRICT = "strict"; public static final String QUIRKS = "quirks"; private static final Map<String, Integer> PARAMETERS = ImmutableMap.<String, Integer>builder() .put(STRICT, 0) .put(QUIRKS, 0) .put(RUNNER_TYPE, 1) .put(SlavePageRequest.UPLOAD_SIZE, 1) .put(SlavePageRequest.MODE, 1) .put(SlavePageRequest.ID, 1) .put(SlavePageRequest.TIMEOUT, 1) .put(SlavePageRequest.TESTCASE_ID, 1) .build(); private static final Set<String> BLACKLIST = ImmutableSet.<String>builder().add("capture") .build(); private final SlavePageRequest request; private final HttpServletResponse response; private final BrowserHunter browserHunter; private final ParameterParser restParser; @Inject public CaptureHandler(SlavePageRequest request, HttpServletResponse response, BrowserHunter browserHunter, ParameterParser restParser) { this.browserHunter = browserHunter; this.request = request; this.response = response; this.restParser = restParser; } @Override public void handleIt() throws IOException { final Map<String, String> parameterMap = restParser.getParameterMap(PARAMETERS, BLACKLIST); String mode = parameterMap.get(STRICT) != null ? STRICT : QUIRKS; String id = parameterMap.get(SlavePageRequest.ID); RunnerType runnerType = parseRunnerType(parameterMap.get(RUNNER_TYPE)); Long timeout = parseLong(parameterMap.get(TIMEOUT)); Integer uploadSize = parseInteger(parameterMap.get(SlavePageRequest.UPLOAD_SIZE)); String redirect = service(request.getUserAgent(), mode, id, runnerType, timeout, uploadSize); logger.debug("Redirecting to {}", redirect); response.sendRedirect(redirect); } private Integer parseInteger(String value) { return value == null ? null : Integer.parseInt(value); } private Long parseLong(final String value) { return value == null ? null : Long.parseLong(value); } private RunnerType parseRunnerType(String runnerType) { return runnerType == null ? CLIENT : RunnerType.valueOf(runnerType.toUpperCase()); } public String service(String userAgent, String mode, String id, RunnerType runnerType, Long timeout, Integer uploadSize) { UserAgentParser parser = new UserAgentParser(); parser.parse(userAgent); SlaveBrowser slaveBrowser = browserHunter.captureBrowser(id, parser.getName(), parser.getVersion(), parser.getOs(), timeout, mode, runnerType, uploadSize); return slaveBrowser.getCaptureUrl(); } }