public GadgetsHandlerApi.MetadataResponse call() throws Exception { try { return handlerService.getMetadata(metadataRequest); } catch (Exception e) { sendError(metadataRequest.getUrl(), e, FAILURE_METADATA); return null; } } };
public GadgetsHandlerApi.TokenResponse call() throws Exception { try { return handlerService.getToken(tokenRequest); } catch (Exception e) { sendError(tokenRequest.getUrl(), e, FAILURE_TOKEN); return null; } } };
public GadgetsHandlerApi.JsResponse getJs(GadgetsHandlerApi.JsRequest request) throws ProcessingException { verifyBaseParams(request, false); Set<String> fields = beanFilter.processBeanFields(request.getFields()); JsUri jsUri = createJsUri(request); Uri servedUri = jsUriManager.makeExternJsUri(jsUri); String content = null; Long expireMs = null; if (isFieldIncluded(fields, "jsContent")) { JsResponse response; try { response = jsPipeline.execute(jsRequestBuilder.build(jsUri, servedUri.getAuthority())); } catch (JsException e) { throw new ProcessingException(e.getMessage(), e.getStatusCode()); } content = response.toJsString(); if (response.isProxyCacheable()) { expireMs = getDefaultExpiration(); } } else { expireMs = getDefaultExpiration(); } return createJsResponse(request.getUrl(), servedUri, content, fields, expireMs); }
public CallableData call() throws Exception { try { return new CallableData(url, handlerService.getToken(tokenRequest)); } catch (Exception e) { return new CallableData(url, handlerService.createErrorResponse(null, e, FAILURE_TOKEN)); } } };
public CallableData call() throws Exception { try { return new CallableData(url, handlerService.getMetadata(metadataRequest)); } catch (Exception e) { return new CallableData(url, handlerService.createErrorResponse(null, e, FAILURE_METADATA)); } } };
@Operation(httpMethods = {"POST", "GET"}, path = "js") public GadgetsHandlerApi.BaseResponse js(BaseRequestItem request) throws ProtocolException { // No need for threading since it is one request GadgetsHandlerApi.BaseResponse response; try { JsRequestData jsRequest = new JsRequestData(request); response = handlerService.getJs(jsRequest); } catch (ProcessingException e) { response = handlerService.createErrorResponse(null, e.getHttpStatusCode(), e.getMessage()); } catch (Exception e) { LOG.log(Level.INFO, "Error fetching JS", e); response = handlerService.createErrorResponse(null, HttpResponse.SC_INTERNAL_SERVER_ERROR, FAILURE_JS); } return response; }
public GadgetsHandlerApi.ProxyResponse getProxy(GadgetsHandlerApi.ProxyRequest request) throws ProcessingException { verifyBaseParams(request, true); Set<String> fields = beanFilter.processBeanFields(request.getFields()); ProxyUri proxyUri = createProxyUri(request); List<Uri> uris = proxyUriManager.make(ImmutableList.of(proxyUri), null); HttpResponse httpResponse = null; try { if (isFieldIncluded(fields, "proxyContent")) { httpResponse = proxyHandler.fetch(proxyUri); } } catch (IOException e) { LOG.log(Level.INFO, "Failed to fetch resource " + proxyUri.getResource().toString(), e); throw new ProcessingException("Error getting response content", HttpResponse.SC_BAD_GATEWAY); } catch (GadgetException e) { // TODO: Clean this log if it is too spammy LOG.log(Level.INFO, "Failed to fetch resource " + proxyUri.getResource().toString(), e); throw new ProcessingException("Error getting response content", HttpResponse.SC_BAD_GATEWAY); } try { return createProxyResponse(uris.get(0), httpResponse, fields, getProxyExpireMs(proxyUri, httpResponse)); } catch (IOException e) { // Should never happen! LOG.log(Level.WARNING, "Error creating proxy response", e); throw new ProcessingException("Error getting response content", HttpResponse.SC_INTERNAL_SERVER_ERROR); } }
@Test(expected = ProcessingException.class) public void testJsNoContainer() throws Exception { List<String> fields = ImmutableList.of("*"); GadgetsHandlerApi.JsRequest request = createJsRequest(null, null, fields, ImmutableList.of("rpc"), null); gadgetHandler.getJs(request); }
verifyBaseParams(request, true); Set<String> fields = beanFilter.processBeanFields(request.getFields()); Gadget gadget = processor.process(context); boolean needIfrUrls = isFieldIncluded(fields, "iframeurls"); if (needIfrUrls) { if(!gadgetAdminStore.checkFeatureAdminInfo(gadget)) { translateUris(iframeUriManager.makeAllRenderingUris(gadget)) : null; Boolean needsTokenRefresh = isFieldIncluded(fields, "needstokenrefresh") ? gadget.getAllFeatures().contains("auth-refresh") : null; boolean alwaysAppendSecurityToken = config.getBool(gadget.getContext().getContainer(), needsTokenRefresh = Boolean.TRUE; Set<String> rpcServiceIds = getRpcServiceIds(gadget); Integer tokenTTL = isFieldIncluded(fields, "tokenTTL") ? securityTokenCodec.getTokenTimeToLive(context.getContainer()) : null; return createMetadataResponse(context.getUrl(), gadget.getSpec(), uris, needsTokenRefresh, fields, timeSource.currentTimeMillis() + specRefreshInterval, tokenTTL, rpcServiceIds);
@Test public void testFilterProxyResponse() throws Exception { HttpResponse httpResponse = new HttpResponse("data"); GadgetsHandlerApi.ProxyResponse response = gadgetHandler.createProxyResponse(RESOURCE, httpResponse, ImmutableSet.<String> of("proxyurl"), 1000001L); assertNull(response.getProxyContent()); assertEquals(RESOURCE, response.getProxyUrl()); }
@Before public void setUp() { tokenCodec = new FakeSecurityTokenCodec(); gadgetHandler = new GadgetsHandlerService(processor, urlGenerator, tokenCodec, new BeanFilter()); }
/** * Create security token * @param request token paramaters (gadget, owner and viewer) * @return Security token * @throws SecurityTokenException */ public GadgetsHandlerApi.TokenResponse getToken(GadgetsHandlerApi.TokenRequest request) throws SecurityTokenException, ProcessingException { if (request.getUrl() == null) { throw new ProcessingException("Missing url paramater", HttpResponse.SC_BAD_REQUEST); } if (request.getContainer() == null) { throw new ProcessingException("Missing container paramater", HttpResponse.SC_BAD_REQUEST); } if (request.getFields() == null) { throw new ProcessingException("Missing fields paramater", HttpResponse.SC_BAD_REQUEST); } Set<String> fields = beanFilter.processBeanFields(request.getFields()); SecurityToken tokenData = convertToken(request.getToken(), request.getContainer(), request.getUrl().toString()); String token = securityTokenCodec.encodeToken(tokenData); return createTokenResponse(request.getUrl(), token, fields); }
verifyBaseParams(request, true); Set<String> fields = beanFilter.processBeanFields(request.getFields()); AuthContext authContext = request.getAuthContext(); tokenData = convertAuthContext(authContext, request.getContainer(), request.getUrl().toString(), moduleId, request.getUrl().toString()); token = securityTokenCodec.encodeToken(tokenData); if (tokenData != null) { expiryTimeMs = tokenData.getExpiresAt(); tokenTTL = isFieldIncluded(fields, "tokenTTL") ? securityTokenCodec.getTokenTimeToLive(tokenData.getContainer()) : null; moduleId = isFieldIncluded(fields, "moduleId") ? moduleId : null; return createTokenResponse(request.getUrl(), token, fields, expiryTimeMs, tokenTTL, moduleId);
public GadgetsHandlerApi.CajaResponse getCaja(GadgetsHandlerApi.CajaRequest request) throws ProcessingException { verifyBaseParams(request, true); Set<String> fields = beanFilter.processBeanFields(request.getFields()); MessageContext mc = new MessageContext(); CajoledResult result = cajaContentRewriter.rewrite(request.getUrl(), request.getContainer(), request.getMimeType(), true /* only support es53 */, request.getDebug()); String html = null; String js = null; if (!result.hasErrors && null != result.html) { html = Nodes.render(result.html); } if (!result.hasErrors && null != result.js) { StringBuilder builder = new StringBuilder(); TokenConsumer tc = request.getDebug() ? new JsPrettyPrinter(new Concatenator(builder)) : new JsMinimalPrinter(new Concatenator(builder)); RenderContext rc = new RenderContext(tc) .withAsciiOnly(true) .withEmbeddable(true); result.js.render(rc); rc.getOut().noMoreTokens(); js = builder.toString(); } // TODO(jasvir): Improve Caja responses expiration handling return createCajaResponse(request.getUrl(), html, js, convertMessages(result.messages, mc), fields, timeSource.currentTimeMillis() + specRefreshInterval); }
@Test public void testCreateJsResponse() throws Exception { Uri jsUri = Uri.parse("http://www.shindig.com/js"); String content = "content"; GadgetsHandlerApi.JsResponse jsResponse = gadgetHandler.createJsResponse(null, jsUri, content, ImmutableSet.of("*"), null); BeanDelegator.validateDelegator(jsResponse); }
@Test public void testCreateCajaResponse() throws Exception { String goldenEntries[][] = { { "name1", "LINT", "msg1" }, { "name2", "LINT", "msg2" } }; List<GadgetsHandlerApi.Message> goldenMessages = Lists.newArrayList(); for (String[] goldenEntry : goldenEntries) { GadgetsHandlerApi.Message m = mock(GadgetsHandlerApi.Message.class); expect(m.getName()).andReturn(goldenEntry[0]); expect(m.getLevel()).andReturn(GadgetsHandlerApi.MessageLevel.valueOf(goldenEntry[1])); expect(m.getMessage()).andReturn(goldenEntry[2]); goldenMessages.add(m); } replay(); Uri jsUri = Uri.parse("http://www.shindig.com/js"); GadgetsHandlerApi.CajaResponse jsResponse = gadgetHandler.createCajaResponse(jsUri, "html", "js", goldenMessages, ImmutableSet.of("*"), null); BeanDelegator.validateDelegator(jsResponse); assertEquals("html", jsResponse.getHtml()); assertEquals("js", jsResponse.getJs()); List<GadgetsHandlerApi.Message> response = jsResponse.getMessages(); assertEquals(goldenMessages.size(), response.size()); for (int i = 0; i < response.size(); i++) { assertEquals(goldenEntries[i][0], response.get(i).getName()); assertEquals(goldenEntries[i][1], response.get(i).getLevel().name()); assertEquals(goldenEntries[i][2], response.get(i).getMessage()); } }
/** * Get gadget metadata information and iframe url. Support filtering of fields * @param request request parameters * @return gadget metadata nd iframe url * @throws ProcessingException */ public GadgetsHandlerApi.MetadataResponse getMetadata(GadgetsHandlerApi.MetadataRequest request) throws ProcessingException { if (request.getUrl() == null) { throw new ProcessingException("Missing url paramater", HttpResponse.SC_BAD_REQUEST); } if (request.getContainer() == null) { throw new ProcessingException("Missing container paramater", HttpResponse.SC_BAD_REQUEST); } if (request.getFields() == null) { throw new ProcessingException("Missing fields paramater", HttpResponse.SC_BAD_REQUEST); } Set<String> fields = beanFilter.processBeanFields(request.getFields()); GadgetContext context = new MetadataGadgetContext(request); Gadget gadget = processor.process(context); String iframeUrl = (fields.contains("iframeurl") || fields.contains(BeanFilter.ALL_FIELDS)) ? iframeUriManager.makeRenderingUri(gadget).toString() : null; Boolean needsTokenRefresh = (fields.contains("needstokenrefresh") || fields.contains(BeanFilter.ALL_FIELDS)) ? gadget.getAllFeatures().contains("auth-refresh") : null; return createMetadataResponse(context.getUrl(), gadget.getSpec(), iframeUrl, needsTokenRefresh, fields); }
@Test public void testCreateProxyUri() throws Exception { GadgetsHandlerApi.ImageParams image = mock(GadgetsHandlerApi.ImageParams.class); expect(image.getDoNotExpand()).andStubReturn(true); expect(image.getHeight()).andStubReturn(120); expect(image.getWidth()).andStubReturn(210); expect(image.getQuality()).andStubReturn(77); GadgetsHandlerApi.ProxyRequest request = mock(GadgetsHandlerApi.ProxyRequest.class); expect(request.getContainer()).andStubReturn(CONTAINER); expect(request.getUrl()).andStubReturn(RESOURCE); expect(request.getRefresh()).andStubReturn(new Integer(333)); expect(request.getDebug()).andStubReturn(true); expect(request.getFallbackUrl()).andStubReturn(FALLBACK); expect(request.getGadget()).andStubReturn(FakeProcessor.SPEC_URL.toString()); expect(request.getIgnoreCache()).andStubReturn(true); expect(request.getImageParams()).andStubReturn(image); expect(request.getRewriteMimeType()).andStubReturn("image/png"); expect(request.getSanitize()).andStubReturn(true); replay(); ProxyUri pUri = gadgetHandler.createProxyUri(request); ProxyUri expectedUri = new ProxyUri(333, true, true, CONTAINER, FakeProcessor.SPEC_URL.toString(), RESOURCE); expectedUri.setRewriteMimeType("image/png").setSanitizeContent(true); expectedUri.setResize(210, 120, 77, true).setFallbackUrl(FALLBACK); assertEquals(pUri, expectedUri); verify(); }
@Test(expected = ProcessingException.class) public void testJsNoContainer() throws Exception { List<String> fields = ImmutableList.of("*"); GadgetsHandlerApi.JsRequest request = createJsRequest(null, null, fields, ImmutableList.of("rpc"), null); gadgetHandler.getJs(request); }
@Test public void testValidateProxyResponse() throws Exception { GadgetsHandlerApi.ProxyResponse response = gadgetHandler.createProxyResponse(RESOURCE, null, ImmutableSet.<String> of("*"), 1000001L); BeanDelegator.validateDelegator(response); assertEquals(RESOURCE, response.getProxyUrl()); assertNull(response.getProxyContent()); }