Kotlin

[Kotlin] NanoHTTPD 사용방법

eulBlue 2024. 4. 3. 17:57

📱테스트 환경

Samsung Galaxy Tab Advanced2


[Kotlin] WebView Input 파일 선택

여기에 이어서 .. 이미지를 이제 Web 으로 보내줘야하는데 .. 문제가 Content API 이미지 주소는 보안상 사용할 수가 없다.

그래서 이걸 보안에 걸리지않도록 보내줘야하는데 .. Base64 로 바꿔서 보내주니까

용량이 커질수록 너무 느려져서 문제였다. 사진은 그나마 좀 괜찮았는데 영상은 아주 끔찍한 유저 경험이라 할 수 있다.

그래서 생각해낸 방법이 Android 에서 Web 처럼 주소를 띄워놓고

그걸 Web 에서 받아 blob 로 변환해서 저장하는 방식을 생각했다.

그래서 사용한게 NanoHTTPD 인데 사용방법이 생각보다 간단해서 선택하게 되었다.

 

// build.gralde (Module :app)

implementation 'org.nanohttpd:nanohttpd:2.3.1'

종속성 먼저 추가해 주고

// MainActivity.kt
private lateinit var webServer: WebServer
override fun onCreate(savedInstanceState: Bundle?) {
	...
	webServer = WebServer(applicationContext).apply {
        start()
    }
    ...
}


override fun onDestroy() {
    super.onDestroy()

    webServer.stop()
}

만들어졌을 때 웹서버를 가동시키고 앱이 종료될때 웹을 종료해주었다.

class WebServer(private val context: Context) : NanoHTTPD(8080) {
    override fun serve(session: IHTTPSession): Response {
        val uri = session.uri.removePrefix("/")
        return try {
            val contentUri = Uri.parse(uri)
            val inputStream = context.contentResolver.openInputStream(contentUri)
                ?: return newFixedLengthResponse(Response.Status.NOT_FOUND, MIME_PLAINTEXT, "File not found")
            val mine = context.contentResolver.getType(contentUri) ?: "application/octet-stream"
            val response = newChunkedResponse(Response.Status.OK, mine, inputStream)
            response.addHeader("Access-Control-Allow-Origin", DEFAULT_BASE_URL.removeSuffix("/"))
            response.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT")
            response.addHeader("Access-Control-Allow-Headers", "Content-Type, Accept, baggage, sentry-trace")
            response.addHeader("Access-Control-Allow-Credentials", "true")
            response.addHeader("Cache-Control", "no-cache")

            response

        } catch (e: IOException) {
            e.printStackTrace()
            newFixedLengthResponse(Response.Status.INTERNAL_ERROR, MIME_PLAINTEXT, "Internal server error")
        }
    }
}

나는 Appconfig 에 DEFAULT_BASE.URL 을 정의해놓고 쓰다보니 저렇게 사용했지만 간단한 테스트라면 "*"

설정해놓고 먼저 테스트해보는것도 좋았다.

url 에서 앞의 "/" 를 제거한 이유는 주소가 "/content:// ~" 이런식으로 시작되다보니 제거해주었고

sentry 를 사용중이다보니 해당 헤더 추가해줬고, baggage 도 추가해줬다.

이렇게 하고 Web 으로 이미지나 동영상 주소를 전달해주고 해당 주소를 이용해 Blob 형태로 만들어서 사용하는데 성공

https://github.com/NanoHttpd/nanohttpd

 

GitHub - NanoHttpd/nanohttpd: Tiny, easily embeddable HTTP server in Java.

Tiny, easily embeddable HTTP server in Java. Contribute to NanoHttpd/nanohttpd development by creating an account on GitHub.

github.com