| 
					
				 | 
			
			
				@@ -61,7 +61,7 @@ class SimpleCORSFilter : Filter { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @Component 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-@Order(1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@Order(2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 class BridgeFilter(private val template: SimpMessagingTemplate, val resourceLoader: ResourceLoader) : Filter { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     override fun doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         val req = request as HttpServletRequest 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -78,56 +78,58 @@ class BridgeFilter(private val template: SimpMessagingTemplate, val resourceLoad 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (search != null && !search.endsWith("assets/bootstrap.js")) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 res.sendRedirect("/resources/$search") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                println("client $client") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                println("path " + req.requestURL.toString() + "?" + req.queryString) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (req.getHeader("User-Agent").contains("(dart:io)") || req.requestURL.toString().endsWith("api/license")) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    val headerMap = req.headerNames.toList().associateBy({ it }, { req.getHeader(it) }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    val body = req.reader.lines().toList().joinToString(System.lineSeparator()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                val headerMap = req.headerNames.toList().associateBy({ it }, { req.getHeader(it) }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                val body = req.reader.lines().toList().joinToString(System.lineSeparator()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    val reqId = UUID.randomUUID().toString() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    val rb = RequestBuilder(reqId, toPath, HttpMethod.valueOf(req.method), headerMap.toMutableMap()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    rb.body = body 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                val reqId = UUID.randomUUID().toString() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                val rb = RequestBuilder(reqId, toPath, HttpMethod.valueOf(req.method), headerMap.toMutableMap()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                rb.body = body 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    rb.queryString = req.parameterMap 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Singletons.requestInstance[reqId] = RequestQue(reqId, rb, null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                rb.queryString = req.parameterMap 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                Singletons.requestInstance[reqId] = RequestQue(reqId, rb, null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    template.convertAndSend("/topic/$client", RequestTrigger(reqId)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                template.convertAndSend("/topic/$client", RequestTrigger(reqId)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    var i = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                var i = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    while (Singletons.responseQue[reqId] == null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        TimeUnit.MILLISECONDS.sleep(100) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        i++ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (i >= 600) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            res.status = HttpStatus.REQUEST_TIMEOUT.value() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            res.writer.write("{\"message\":\"Request timeout. Client not responding\"}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            res.flushBuffer() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            Singletons.requestInstance.remove(reqId) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                while (Singletons.responseQue[reqId] == null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    TimeUnit.MILLISECONDS.sleep(100) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    i++ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    if (i >= 600) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    val resFromSocket = Singletons.responseQue[reqId] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        res.status = HttpStatus.REQUEST_TIMEOUT.value() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        res.writer.write("{\"message\":\"Request timeout. Client not responding\"}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        res.flushBuffer() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        Singletons.requestInstance.remove(reqId) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    res.status = resFromSocket!!.statusCode 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    resFromSocket.headers?.let { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        it.entries 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                .filter { f -> resFromSocket.statusCode < 400 || (resFromSocket.statusCode >= 400 && f.key == "Content-Type") } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                .forEach { en -> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    res.setHeader(en.key, en.value.joinToString(",")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                val resFromSocket = Singletons.responseQue[reqId] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                res.status = resFromSocket!!.statusCode 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                resFromSocket.headers?.let { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    it.entries 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            .filter { f -> resFromSocket.statusCode < 400 || (resFromSocket.statusCode >= 400 && f.key == "Content-Type") } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            .forEach { en -> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                res.setHeader(en.key, en.value.joinToString(",")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    resFromSocket.body?.let { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        res.outputStream.write(it) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                resFromSocket.body?.let { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    res.outputStream.write(it) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    res.flushBuffer() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                res.flushBuffer() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Singletons.requestInstance.remove(reqId) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                Singletons.requestInstance.remove(reqId) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    response.status = HttpStatus.NOT_FOUND.value() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    response.getWriter().write("Resource not found") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -149,7 +151,7 @@ class BridgeFilter(private val template: SimpMessagingTemplate, val resourceLoad 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @Component 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-@Order(Ordered.LOWEST_PRECEDENCE) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@Order(1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 class RequestFilter : Filter { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     override fun doFilter(sreq: ServletRequest?, sres: ServletResponse?, fc: FilterChain?) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         val req = sreq as HttpServletRequest 
			 |