public static Survey buildSurvey(MavLinkDrone drone, Survey survey) { org.droidplanner.services.android.core.mission.Mission droneMission = drone == null ? null : drone.getMission(); SurveyImpl updatedSurveyImpl = (SurveyImpl) ProxyUtils.getMissionItemImpl(droneMission, survey); return (Survey) ProxyUtils.getProxyMissionItem(updatedSurveyImpl); }
public static StructureScanner buildStructureScanner(MavLinkDrone drone, StructureScanner item) { org.droidplanner.services.android.core.mission.Mission droneMission = drone == null ? null : drone.getMission(); StructureScannerImpl updatedScan = (StructureScannerImpl) ProxyUtils.getMissionItemImpl(droneMission, item); StructureScanner proxyScanner = (StructureScanner) ProxyUtils.getProxyMissionItem(updatedScan); return proxyScanner; }
@Test public void testAddNewViaHeader() { String hostname = ProxyUtils.getHostName(); HttpMessage httpMessage = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/endpoint"); ProxyUtils.addVia(httpMessage); List<String> viaHeaders = httpMessage.headers().getAll(HttpHeaders.Names.VIA); assertThat(viaHeaders, hasSize(1)); String expectedViaHeader = "1.1 " + hostname; assertEquals(expectedViaHeader, viaHeaders.get(0)); }
/** * Creates a new proxy server. * * @param port The port the server should run on. * @param responseFilters The {@link Map} of request domains to match with associated {@link * HttpFilter}s for filtering responses to those requests. * @param chainProxyManager The proxy to send requests to if chaining proxies. Typically <code> * null</code>. * @param ksm The key manager if running the proxy over SSL. * @param requestFilter Optional filter for modifying incoming requests. Often <code>null</code>. * @param clientChannelFactory The factory for creating outgoing channels to external sites. * @param timer The global timer for timing out idle connections. * @param serverChannelFactory The factory for creating listening channels for incoming * connections. */ public DefaultHttpProxyServer( final int port, final HttpResponseFilters responseFilters, final ChainProxyManager chainProxyManager, final KeyStoreManager ksm, final HttpRequestFilter requestFilter, final ClientSocketChannelFactory clientChannelFactory, final Timer timer, final ServerSocketChannelFactory serverChannelFactory, final ProxyCacheManager cacheManager) { this.port = port; this.responseFilters = responseFilters; this.ksm = ksm; this.requestFilter = requestFilter; this.chainProxyManager = chainProxyManager; this.clientChannelFactory = clientChannelFactory; this.timer = timer; this.serverChannelFactory = serverChannelFactory; if (cacheManager == null) { this.cacheManager = ProxyUtils.loadCacheManager(); } else { this.cacheManager = cacheManager; } Thread.setDefaultUncaughtExceptionHandler( new UncaughtExceptionHandler() { public void uncaughtException(final Thread t, final Throwable e) { log.error("Uncaught throwable", e); } }); // Use our thread names so users know there are LittleProxy threads. ThreadRenamingRunnable.setThreadNameDeterminer(ThreadNameDeterminer.CURRENT); this.serverBootstrap = new ServerBootstrap(serverChannelFactory); }
public static CameraProxy getCameraProxy(MavLinkDrone drone, List<CameraDetail> cameraDetails) { final CameraDetail camDetail; final FootPrint currentFieldOfView; final List<FootPrint> proxyPrints = new ArrayList<>(); if (drone == null) { camDetail = new CameraDetail(); currentFieldOfView = new FootPrint(); } else { Camera droneCamera = drone.getCamera(); camDetail = ProxyUtils.getCameraDetail(droneCamera.getCamera()); List<Footprint> footprints = droneCamera.getFootprints(); for (Footprint footprint : footprints) { proxyPrints.add(CommonApiUtils.getProxyCameraFootPrint(footprint)); } Gps droneGps = (Gps) drone.getAttribute(AttributeType.GPS); currentFieldOfView = droneGps != null && droneGps.isValid() ? CommonApiUtils.getProxyCameraFootPrint(droneCamera.getCurrentFieldOfView()) : new FootPrint(); } return new CameraProxy(camDetail, currentFieldOfView, proxyPrints, cameraDetails); }
/** * {@inheritDoc} * * @see org.springframework.security.access.method.MethodSecurityMetadataSource#getAttributes( * java.lang.reflect.Method, java.lang.Class) */ public Collection<ConfigAttribute> getAttributes(final Method m, final Class<?> tc) { Method method = ProxyUtils.unproxy(m); Class<?> targetClass = ProxyUtils.unproxy(tc); DefaultCacheKey cacheKey = new DefaultCacheKey(method, targetClass); synchronized (_cache) { Collection<ConfigAttribute> cached = _cache.get(cacheKey); // Check for canonical value indicating there is no config attribute, if (cached == NULL_CONFIG_ATTRIBUTE) { return null; } if (cached != null) { return cached; } // No cached value, so query the sources to find a result Collection<ConfigAttribute> attributes = null; for (MethodSecurityMetadataSource s : _methodSecurityMetadataSources) { attributes = s.getAttributes(method, targetClass); if (attributes != null && !attributes.isEmpty()) { break; } } // Put it in the cache. if (attributes == null) { _cache.put(cacheKey, NULL_CONFIG_ATTRIBUTE); return null; } if (logger.isDebugEnabled()) { logger.debug("Adding security method [" + cacheKey + "] with attributes " + attributes); } _cache.put(cacheKey, attributes); return attributes; } }
@Test public void testParseHostAndPort() throws Exception { assertEquals("www.test.com:80", ProxyUtils.parseHostAndPort("http://www.test.com:80/test")); assertEquals("www.test.com:80", ProxyUtils.parseHostAndPort("https://www.test.com:80/test")); assertEquals("www.test.com:443", ProxyUtils.parseHostAndPort("https://www.test.com:443/test")); assertEquals("www.test.com:80", ProxyUtils.parseHostAndPort("www.test.com:80/test")); assertEquals("www.test.com", ProxyUtils.parseHostAndPort("http://www.test.com")); assertEquals("www.test.com", ProxyUtils.parseHostAndPort("www.test.com")); assertEquals("httpbin.org:443", ProxyUtils.parseHostAndPort("httpbin.org:443/get")); }
public static void setMission(MavLinkDrone drone, Mission mission, boolean pushToDrone) { if (drone == null) return; org.droidplanner.services.android.core.mission.Mission droneMission = drone.getMission(); droneMission.clearMissionItems(); List<MissionItem> itemsList = mission.getMissionItems(); for (MissionItem item : itemsList) { droneMission.addMissionItem(ProxyUtils.getMissionItemImpl(droneMission, item)); } if (pushToDrone) droneMission.sendMissionToAPM(); }
public static Mission getMission(MavLinkDrone drone) { Mission proxyMission = new Mission(); if (drone == null) return proxyMission; org.droidplanner.services.android.core.mission.Mission droneMission = drone.getMission(); List<org.droidplanner.services.android.core.mission.MissionItem> droneMissionItems = droneMission.getComponentItems(); proxyMission.setCurrentMissionItem((short) drone.getMissionStats().getCurrentWP()); if (!droneMissionItems.isEmpty()) { for (org.droidplanner.services.android.core.mission.MissionItem item : droneMissionItems) { proxyMission.addMissionItem(ProxyUtils.getProxyMissionItem(item)); } } return proxyMission; }
/** @return the nested diagnostic context string for this step's log file */ @SuppressWarnings("unchecked") private String getNestedDiagnosticContext() { Step unProxiedStep = (Step) ProxyUtils.getTargetIfProxied(step); Class stepClass = unProxiedStep.getClass(); ModuleService module = SpringContext.getBean(KualiModuleService.class).getResponsibleModuleService(stepClass); String nestedDiagnosticContext = StringUtils.substringAfter(module.getModuleConfiguration().getNamespaceCode(), "-") .toLowerCase() + File.separator + step.getName() + "-" + dateTimeService.toDateTimeStringForFilename(dateTimeService.getCurrentDate()); return nestedDiagnosticContext; }
/** * Creates a new proxy server. * * @param port The port the server should run on. * @param responseFilters The {@link Map} of request domains to match with associated {@link * HttpFilter}s for filtering responses to those requests. * @param chainProxyManager The proxy to send requests to if chaining proxies. Typically <code> * null</code>. * @param ksm The key manager if running the proxy over SSL. * @param requestFilter Optional filter for modifying incoming requests. Often <code>null</code>. * @param clientChannelFactory The factory for creating outgoing channels to external sites. * @param timer The global timer for timing out idle connections. * @param serverChannelFactory The factory for creating listening channels for incoming * connections. */ public DefaultHttpProxyServer( final int port, final HttpResponseFilters responseFilters, final ChainProxyManager chainProxyManager, final KeyStoreManager ksm, final HttpRequestFilter requestFilter, final ClientSocketChannelFactory clientChannelFactory, final Timer timer, final ServerSocketChannelFactory serverChannelFactory) { this( port, responseFilters, chainProxyManager, ksm, requestFilter, clientChannelFactory, timer, serverChannelFactory, ProxyUtils.loadCacheManager()); }
@Test public void testCommaSeparatedHeaderValues() { DefaultHttpMessage message; List<String> commaSeparatedHeaders; // test the empty headers case message = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); commaSeparatedHeaders = ProxyUtils.getAllCommaSeparatedHeaderValues(HttpHeaders.Names.TRANSFER_ENCODING, message); assertThat(commaSeparatedHeaders, empty()); // two headers present, but no values message = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); message.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, ""); message.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, ""); commaSeparatedHeaders = ProxyUtils.getAllCommaSeparatedHeaderValues(HttpHeaders.Names.TRANSFER_ENCODING, message); assertThat(commaSeparatedHeaders, empty()); // a single header value message = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); message.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, "chunked"); commaSeparatedHeaders = ProxyUtils.getAllCommaSeparatedHeaderValues(HttpHeaders.Names.TRANSFER_ENCODING, message); assertThat(commaSeparatedHeaders, contains("chunked")); // a single header value with extra spaces message = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); message.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, " chunked , "); commaSeparatedHeaders = ProxyUtils.getAllCommaSeparatedHeaderValues(HttpHeaders.Names.TRANSFER_ENCODING, message); assertThat(commaSeparatedHeaders, contains("chunked")); // two comma-separated values in one header line message = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); message.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, "compress, gzip"); commaSeparatedHeaders = ProxyUtils.getAllCommaSeparatedHeaderValues(HttpHeaders.Names.TRANSFER_ENCODING, message); assertThat(commaSeparatedHeaders, contains("compress", "gzip")); // two comma-separated values in one header line with a spurious ',' and space. see RFC 7230 // section 7 // for information on empty list items (not all of which are valid header-values). message = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); message.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, "compress, gzip, ,"); commaSeparatedHeaders = ProxyUtils.getAllCommaSeparatedHeaderValues(HttpHeaders.Names.TRANSFER_ENCODING, message); assertThat(commaSeparatedHeaders, contains("compress", "gzip")); // two values in two separate header lines message = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); message.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, "gzip"); message.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, "chunked"); commaSeparatedHeaders = ProxyUtils.getAllCommaSeparatedHeaderValues(HttpHeaders.Names.TRANSFER_ENCODING, message); assertThat(commaSeparatedHeaders, contains("gzip", "chunked")); // multiple comma-separated values in two separate header lines message = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); message.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, "gzip, compress"); message.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, "deflate, gzip"); commaSeparatedHeaders = ProxyUtils.getAllCommaSeparatedHeaderValues(HttpHeaders.Names.TRANSFER_ENCODING, message); assertThat(commaSeparatedHeaders, contains("gzip", "compress", "deflate", "gzip")); // multiple comma-separated values in multiple header lines with spurious spaces, commas, // and tabs (horizontal tabs are defined as optional whitespace in RFC 7230 section 3.2.3) message = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); message.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, " gzip,compress,"); message.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, "\tdeflate\t, gzip, "); message.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, ",gzip,,deflate,\t, ,"); commaSeparatedHeaders = ProxyUtils.getAllCommaSeparatedHeaderValues(HttpHeaders.Names.TRANSFER_ENCODING, message); assertThat( commaSeparatedHeaders, contains("gzip", "compress", "deflate", "gzip", "gzip", "deflate")); }
@Test public void testIsResponseSelfTerminating() { HttpResponse httpResponse; boolean isResponseSelfTerminating; // test cases from the scenarios listed in RFC 2616, section 4.4 // #1: 1.Any response message which "MUST NOT" include a message-body (such as the 1xx, 204, and // 304 responses and any response to a HEAD request) is always terminated by the first empty // line after the header fields, regardless of the entity-header fields present in the message. httpResponse = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.CONTINUE); isResponseSelfTerminating = ProxyUtils.isResponseSelfTerminating(httpResponse); assertEquals(true, isResponseSelfTerminating); // #2: 2.If a Transfer-Encoding header field (section 14.41) is present and has any value other // than "identity", then the transfer-length is defined by use of the "chunked" transfer-coding // (section 3.6), unless the message is terminated by closing the connection. httpResponse = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); httpResponse.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, "chunked"); isResponseSelfTerminating = ProxyUtils.isResponseSelfTerminating(httpResponse); assertEquals(true, isResponseSelfTerminating); httpResponse = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); httpResponse.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, "gzip, chunked"); isResponseSelfTerminating = ProxyUtils.isResponseSelfTerminating(httpResponse); assertEquals(true, isResponseSelfTerminating); // chunked encoding is not last, so not self terminating httpResponse = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); httpResponse.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, "chunked, gzip"); isResponseSelfTerminating = ProxyUtils.isResponseSelfTerminating(httpResponse); assertEquals(false, isResponseSelfTerminating); // four encodings on two lines, chunked is not last, so not self terminating httpResponse = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); httpResponse.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, "gzip, chunked"); httpResponse.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, "deflate, gzip"); isResponseSelfTerminating = ProxyUtils.isResponseSelfTerminating(httpResponse); assertEquals(false, isResponseSelfTerminating); // three encodings on two lines, chunked is last, so self terminating httpResponse = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); httpResponse.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, "gzip"); httpResponse.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, "deflate,chunked"); isResponseSelfTerminating = ProxyUtils.isResponseSelfTerminating(httpResponse); assertEquals(true, isResponseSelfTerminating); // #3: 3.If a Content-Length header field (section 14.13) is present, its decimal value in // OCTETs represents both the entity-length and the transfer-length. httpResponse = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); httpResponse.headers().add(HttpHeaders.Names.CONTENT_LENGTH, "15"); isResponseSelfTerminating = ProxyUtils.isResponseSelfTerminating(httpResponse); assertEquals(true, isResponseSelfTerminating); // continuing #3: If a message is received with both a Transfer-Encoding header field and a // Content-Length header field, the latter MUST be ignored. // chunked is last Transfer-Encoding, so message is self-terminating httpResponse = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); httpResponse.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, "gzip, chunked"); httpResponse.headers().add(HttpHeaders.Names.CONTENT_LENGTH, "15"); isResponseSelfTerminating = ProxyUtils.isResponseSelfTerminating(httpResponse); assertEquals(true, isResponseSelfTerminating); // chunked is not last Transfer-Encoding, so message is not self-terminating, since // Content-Length is ignored httpResponse = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); httpResponse.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, "gzip"); httpResponse.headers().add(HttpHeaders.Names.CONTENT_LENGTH, "15"); isResponseSelfTerminating = ProxyUtils.isResponseSelfTerminating(httpResponse); assertEquals(false, isResponseSelfTerminating); // without any of the above conditions, the message should not be self-terminating // (multipart/byteranges is ignored, see note in method javadoc) httpResponse = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); isResponseSelfTerminating = ProxyUtils.isResponseSelfTerminating(httpResponse); assertEquals(false, isResponseSelfTerminating); }