|
@@ -62,63 +62,85 @@ class SimpleCORSFilter : Filter {
|
|
|
class BridgeFilter(private val template: SimpMessagingTemplate, val resourceLoader: ResourceLoader) : Filter {
|
|
|
override fun doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) {
|
|
|
val req = request as HttpServletRequest
|
|
|
+ val res = response as HttpServletResponse
|
|
|
val splitPath = req.requestURI.split("/")
|
|
|
val client = splitPath[1]
|
|
|
val toPath = "/" + splitPath.takeLast(splitPath.size - 1).joinToString("/")
|
|
|
- if (client.startsWith("_")) {
|
|
|
+
|
|
|
+ if (client.startsWith("_") || client.startsWith("resources")) {
|
|
|
chain.doFilter(request, response)
|
|
|
return
|
|
|
- }
|
|
|
-
|
|
|
- println("client $client")
|
|
|
- println("path $toPath")
|
|
|
+ } else {
|
|
|
+ val search = isResourceAvailable(toPath)
|
|
|
+ if (search != null && search != "assets/bootstrap.js") {
|
|
|
+ res.sendRedirect("/resources/$search")
|
|
|
+ } else {
|
|
|
+ println("client $client")
|
|
|
+ println("path $toPath")
|
|
|
|
|
|
// req.parameterMap.entries.forEach {
|
|
|
// println(it.key + " : " + it.value.joinToString(", "))
|
|
|
// }
|
|
|
|
|
|
- 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))
|
|
|
|
|
|
- val res = response as HttpServletResponse
|
|
|
- var i = 0
|
|
|
|
|
|
- while (Singletons.responseQue[reqId] == null) {
|
|
|
- TimeUnit.MILLISECONDS.sleep(100)
|
|
|
- i++
|
|
|
- if (i >= 600) {
|
|
|
+ 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.status = HttpStatus.REQUEST_TIMEOUT.value()
|
|
|
+ res.writer.write("{\"message\":\"Request timeout. Client not responding\"}")
|
|
|
+ res.flushBuffer()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ val resFromSocket = Singletons.responseQue[reqId]
|
|
|
+ res.status = resFromSocket!!.statusCode
|
|
|
+ resFromSocket.headers?.let {
|
|
|
+ it.entries.forEach { en ->
|
|
|
+// println(en.key + " : " + en.value.joinToString(","))
|
|
|
+ res.setHeader(en.key, en.value.joinToString(","))
|
|
|
+ }
|
|
|
+ }
|
|
|
+ res.outputStream.write(IOUtils.toByteArray(resFromSocket.body))
|
|
|
+// resFromSocket.body.let { res.writer.write(it) }
|
|
|
res.flushBuffer()
|
|
|
+ Singletons.requestInstance.remove(reqId)
|
|
|
return
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- val resFromSocket = Singletons.responseQue[reqId]
|
|
|
- res.status = resFromSocket!!.statusCode
|
|
|
- resFromSocket.headers?.let {
|
|
|
- it.entries.forEach { en ->
|
|
|
-// println(en.key + " : " + en.value.joinToString(","))
|
|
|
- res.setHeader(en.key, en.value.joinToString(","))
|
|
|
- }
|
|
|
- }
|
|
|
- res.outputStream.write(IOUtils.toByteArray(resFromSocket.body))
|
|
|
-// resFromSocket.body.let { res.writer.write(it) }
|
|
|
- res.flushBuffer()
|
|
|
- Singletons.requestInstance.remove(reqId)
|
|
|
- return
|
|
|
|
|
|
+ }
|
|
|
|
|
|
+ fun isResourceAvailable(path: String, itr: Int = 1): String? {
|
|
|
+ val splPath = path.split("/").takeLast(itr)
|
|
|
+ if (splPath.size >= itr) {
|
|
|
+ val search = splPath.joinToString("/")
|
|
|
+ println("search $search")
|
|
|
+ val resource = resourceLoader.getResource("file:dist/$search")
|
|
|
+ return if (resource.exists() && resource.file.isFile) {
|
|
|
+ return search
|
|
|
+ } else {
|
|
|
+ isResourceAvailable(path, itr + 1)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -141,7 +163,7 @@ class RequestBuilder(val id: String, val path: String, val method: HttpMethod, v
|
|
|
var queryString: MutableMap<String, Array<String>>? = null
|
|
|
}
|
|
|
|
|
|
-class Resp(val body: InputStream, val statusCode: Int, val headers: Map<String, Array<String>>? = null)
|
|
|
+class Resp(val body: InputStream?, val statusCode: Int, val headers: Map<String, Array<String>>? = null)
|
|
|
|
|
|
object Singletons {
|
|
|
val responseQue: MutableMap<String, Resp> by lazy { mutableMapOf<String, Resp>() }
|