|
@@ -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
|