java.lang.SecurityException: Permission denied (missing INTERNET permission?) at java.net.InetAddress.lookupHostByName(InetAddress.java:418) at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) at java.net.InetAddress.getAllByName(InetAddress.java:214) at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70) at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50) at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340) at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87) at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316) at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:461) at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433) at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290) at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240) at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:81) at libcore.net.http.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:165) ... Caused by: libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname) at libcore.io.Posix.getaddrinfo(Native Method) at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.java:61) at java.net.InetAddress.lookupHostByName(InetAddress.java:405) ... 22 more Caused by: libcore.io.ErrnoException: getaddrinfo failed: EACCES (Permission denied) ... 25 more
퍼미션을 누락했기 때문에 보안이슈가 발생했을 수있다는 부분이다. 보통 답변들은 아래 퍼미션이 누락되었다고 답변하고 있다.
<uses-permission android:name="android.permission.INTERNET"/>
하지만, 위 사례는 퍼미션이 포함되어 있는데도 문제가 발생하는 경우이다. 에러를 좀 더 살펴보면 DNS 서버에서 데이터를 받지 못했(getaddrinfo failed: EAI_NODATA 부분)고, 그 아랫 부분에 왜 정보를 받지 못했는지 아래와 같이 에러가 난다.
Caused by: libcore.io.ErrnoException: getaddrinfo failed: EACCES (Permission denied)
내용인 즉, 퍼미션이 없다는 것인데 위에 언급되었듯이 이미 퍼미션은 추가되어 있다 @.@
이와 관련되어 검색해도 다른 해결책이나 원인은 안내된 것이 없다. 개인적인 경험으로는 보통 1회성으로 발생하며 재시도 하는 경우 대체적으로 성공한다. 내 경우에는 header의 url은 example.com을 가리키고, 실제 url은 192.168.0.1 처럼 ip주소인 경우 발생했다.
개인적으로 추측해보건데, 안드로이드에 기본으로 탑재된 HttpClient는 여러가지 이슈를 가진 것으로 널리 알려져있는데, 이도 그 중 하나로 보인다.
참조
- https://github.com/pfleidi/yaxim/issues/167
- http://stackoverflow.com/questions/11273197/error-message-java-net-socketexception-socket-failed-eacces-permission-denie
- http://helloworld.naver.com/helloworld/377316