2012-12-17 2 views
0

조금 미친 문제가 있습니다. POST를 통해 공식을 게시해야하는 IIS7이 있고 NTLM을 통해 인증해야하며이 모든 것들이 SSL 연결을 통과해야합니다. 지금까지 나는 그것을 서버에 연결하고 데이터를 게시하도록 관리했습니다.내 app 용 Android 소스에서 버그를 수정하는 방법?

POST가 끝나면 두 번째 페이지로 리디렉션되는 302 응답을 받게됩니다. DefaultHttpClient가 웹 서버에 연결하면 데이터를 인증하고 게시합니다. 지금까지 모든 것이 작동합니다. 하지만 이제 클라이언트가 연결을 닫고 두 번째 연결을 엽니 다 (이 동작은 anying me입니다). 그러나 이것은 내 문제가 아닙니다. 두 번째 연결에서 클라이언트는 IIS에서 인증하는 방법을 잊어 버리고 401 인증 오류로 중단됩니다.

지금까지는 source of DefaultHttpClient의 수정 된 버그 인 것을 볼 수 있지만 Android는이 lib의 이전 버전을 사용하는 것 같습니다. 전 세계의 모든 안드로이드 장치에있는 것처럼 보이는 버그를 어떻게 해결할 수 있습니까? 여기

내 통신의 관련 부분은 다음과 같습니다

POST /login/ HTTP/1.1 
Content-Length: 21 
Content-Type: application/x-www-form-urlencoded 
Host: example.com 
Connection: Keep-Alive 
Cookie: ASPSESSION... 

[the post data] 

HTTP/1.1 401 Unauthorized 
Content-Type: text/html 
Server: Microsoft-IIS/7.5 
WWW-Authenticate: NTLM 
Content-Length: 1344 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
... 
</html> 

POST /login/ HTTP/1.1 
Content-Length: 21 
Content-Type: application/x-www-form-urlencoded 
Host: example.com 
Connection: Keep-Alive 
Cookie: ASPSESSION... 
Authorization: NTLM ABC...== 

[the post data] 

HTTP/1.1 401 Unauthorized 
Content-Type: text/html; charset=us-ascii 
Server: Microsoft-HTTPAPI/2.0 
WWW-Authenticate: NTLM ABC...DEF 
Content-Length: 341 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd"> 
<HTML><HEAD><TITLE>Not Authorized</TITLE>...</HTML> 

POST /login/ HTTP/1.1 
Content-Length: 21 
Content-Type: application/x-www-form-urlencoded 
Host: example.com 
Connection: Keep-Alive 
Cookie: ASPSESSION... 
Authorization: NTLM ABC...DEF 

[the post data] 

HTTP/1.1 302 Moved Temporary 
Cache-Control: private,no-cache 
Pragma: no-cache 
Content-Length: 31 
Content-Type: application/json; Charset=UTF-8 
Expires: Fri, 07 Dec 2012 07:01:00 GMT 
Location: /login/step2.asp 
Server: Microsoft-IIS/7.5 
Set-Cookie: [...] path=/login/; HttpOnly; 
Persistent-Auth: true 

[some response] 

--- 지금 ---

GET /login/step2.asp HTTP/1.1 
Host: example.com 
Connection: Keep-Alive 
Cookie: ASPSESSION... 


HTTP/1.1 401 Unauthorized 
Content-Type: text/html 
Server: Microsoft-IIS/7.5 
WWW-Authenticate: NTLM 
Content-Length: 1344 

---과를 connetion 닫히지 않습니다 및 제 HTTPS 연결이 열립니다 연결이 다시 닫힙니다. ---

해결 방법을 알고 있습니까?

답변

0

글쎄, 내 문제에 대한 해결책은 아니지만 도움이 될 수 있습니다. 나는 DefaultHttpClient에있는 createClientRequestDirector 기능을 무효화합니다. 여기서 내 자신이 리디렉션을 처리합니다.

연결이 닫히는 원인은 호스트 이름으로 재생한다는 것이므로 호스트 이름이 아닌 IP에 연결됩니다. 결과적으로 원본 URL과 대상 URL을 비교하여 연결을 다시 사용할 수 있으면 클라이언트가 리디렉션되는 동안 보입니다. 따라서 https://www.example.com/https://127.0.0.1/이 결합되어 회의가 종료됩니다.

제 해결책은이 부분을 직접 테스트하는 것입니다. 호스트 이름과 IP가 일치하면 마지막으로 사용한 IP가 반환됩니다. 결과적으로 연결은 재사용 될 수 있으며 위에 링크 된 버그에서 실행되지 않습니다.

1

DefaultHttpClient의 새로운 버전의 라이브러리를 가져 와서 프로젝트에 포함 시키면 어떨까요?

+0

저는 그렇게 단순하지 않다고 생각합니다. Java 파일의 hounders의 패키지 이름을 변경하는 것이 안전한지 확실하지 않습니다. 그리고 안드로이드 팀이 많은 파일을 수정했다는 것을 알고 있습니다. 이게 무언가를 깨뜨리지 않을 것이라는 증거가 있습니까? – rekire

+0

Android가 표준 DefaultHttpClient를 사용한다고 생각합니다. 그러나 확신 할 수 없습니다. 다시 한번 말하지만, 당신이 그것을 시도하지 않는다면 결코 알 수 없을 것입니다. –

+0

확실히, curriently 나는 DefaultRequestDirector 클래스를 읽고 있는데, 여기서 연결이 닫힌 이유를 알았다. 나는 아파치 코드를 사용하기 전에 이것을 고치려고 노력할 것이다. – rekire

관련 문제