skip menu and go to main content

body start

mod_url

Resolved  Windows 지원 패치 8 ]

07.12.15-11:16:53

304683

Submitted by Yang-Bae Park

Assignee 김정균

View992

Priority3

일단 Windows용 아파치의 강제로 UTF-8 변환하는 기능으로 인해 ForceToEncodeUTF8 플래그를 추가하였습니다. (기본 OFF)

그리고 리눅스/유닉스 계열에서 발생하는 문제와 다르게 EUC-KR 일때 발생하는 문제이므로,
클라이언트 인코딩을 EUC-KR, 서버 인코딩을 UTF-8 로 하셔야 윈도우에서 정상작동할 겁니다.


기본적인 작동 원리는 stat() 함수와 apr_stat() 함수를 wrapping해서 처리하도록 했습니다.

사실 위 문제가 Apache 사이트에서 공식으로 빌드한 윈도우용 아파치에서만 발생하는 문제인지, 혹은 다른 시스템에서도 충분히 발생할만한 문제인지, 그리고 내부적으로 이런 현상을 자체적으로 파악해서 처리할 수는 없는지 등에 대한 생각을 아직 심도있게 못해봤습니다.
뭔가 다른 방법으로도 가능할 것 같다는 생각을 지울 수가 없군요.


첫번째 파일은 mod_url v1.12 for Apache2 를 위한 패치 파일이며,
두번째 파일은 Win32 환경에서 컴파일할때 필요한 잡다한 파일들입니다.
(사실 리소스 파일은 꼭 필요한 것은 아니지만... 폼으로 넣어봤습니다. ;)

Comments on this artfact

8 Comments

Yang-Bae Park

File added 407: mod_url-win32misc.zip
File added 406: out.diff

07.12.15-11:16:53

김정균

음.. 감기 몸살로 진행을 못하고 있는데, 대충 보니 ForceToEncodeUTF8 은 굳이 처리할 필요 없을 것 같은데요. #ifdef WIN32 로 처리하면 굳이 옵션까지 가질 필요는 없을 것 같고요.

문제는 님께서 적어주신대로, apache group 에서 빌드한 apache 만 문제이냐의 여부도 체크를 해야 할 수도 있겠네요. 어차피 apache group 에서 빌드한 binary 를 쓰는 경우가 대부분이기는 하겠지만요..

07.12.17-03:36:40

김정균

"Assigned To" was changed from "Nobody" to "김정균"

07.12.17-03:36:40

Yang-Bae Park

다음과 같은 찝찝함 때문에 옵션을 추가했지만...

1. 아파치 그룹에서 빌드한 아파치만의 문제인가?
2. 아파치 버전에 따라 달라지는가?

위 문제만 없다면 말씀하신 것처럼 해당 옵션은 윈도우즈에선 거의 On 시켜야하기
때문에 매크로로 처리하는 것이 더 좋을 것 같습니다.


그럼 남은건 위 문제들의 사실여부인데...

기왕 시작한거 제대로 테스트해보자는 마음에,
각종 바이너리를 가능한한 최대한 테스트해봤습니다.

아파치 버전에 따라 달라지는가 여부는 현재 아파치 그룹 사이트에 올라와있는
모든 Apache2, Apache2.2 바이너리 버전을 대상으로 테스트해봤으나
동일한 문제가 발생하더군요.

따라서 남은건 1번 문제입니다만, 다행히도 RWAPM 같은 자체 빌드한
아파치 바이너리가 kldp.net 프로젝트 트리에 있어서 그것으로 테스트해봤습니다.

똑같은 문제가 발생하더군요. ^^;


이 테스트 결과로 더욱 #ifdef WIN32 만으로 처리가능하다는 것이 확신시 되는것 같습니다.
해당 옵션은 빼버리고 매크로로 처리하는 것이 좋을 것 같네요.

07.12.17-14:03:32

Yang-Bae Park

#ifdef WIN32 를 이용한 매크로로 수정하고 테스트해봤습니다.

out_win32.diff 와 비슷한 방법으로 사용하면 될 듯 싶습니다.

07.12.17-14:23:07

Yang-Bae Park

File added 408: out_win32.diff

07.12.17-14:23:07

김정균

음. Apache 2.0 New Features 에 보니..

Windows NT 유니코드 자체 지원
    Windows NT에서 Apache 2.0은 이제 모든 파일명 인코딩에 utf-8을 사용한다. 파일명은 하위 유니코드 파일시스템으로 직접 변역되어, Windows 2000과 Windows XP를 포함한 모든 Windows NT기반 시스템에 다국어 지원을 제공한다. 이 기능은 Windows 95, 98, ME에는 지원되지않고, 파일시스템 접근에 전과 같이 시스템의 지역 코드페이지를 사용한다.

라고 되어 있군요. 무조건 바꿔주는 것이 맞겠군요.

07.12.22-02:59:26

김정균

흠. 일단 Apache 2 New Features 에 의하면.. 이 패치와 같이 할 필요가 없을 것 같군요. 일단, mod_url 이 할 일을 apache 가 대신 해 주기 때문에, mod_url 에서 할 일은 input encoding 이 UTF8 이 아닐 경우에, UTF8 로 미리 바꿔 놓는 것만 하면 될 것 같네요.

ap_hook_fixups (check_redurl) 은 WINNT mode 에서 작동할 필요가 없을 것이고, pre_redurl 에서는 무조건 !UTF8 을 UTF8 로 넘긴 다음 apache 보고 알아서 하라고 하면 될 것 같습니다.

단, 조건은 SERVER_ENCODING 은 무조건 UTF8 이어야 합니다. (소스에서 WINNT 모드에 하드코딩 되어 있습니다.) 그리고 CLIENT_ENCODING 은 !UTF8 이어야 합니다. 그리고 빌드시에 -DWINNT 를 넘겨 주셔야 합니다. ^^; -DWINNT 를 수동으로 넘겨야 하는 이유는, 모든 win32 가 해당사항이 있는 것이 아니라 Windows NT system 만 이 경우에 해당하기 때문입니다.

http://devel.oops.org/tmp/mod_url-winnt.c

에 수정된 코드가 있으니 한번 테스트 부탁 드립니다. 이상 없이 작동을 하면, commit 하도록 하겠습니다.

07.12.22-04:42:39

Yang-Bae Park

File added 411: win32_compile.bat

07.12.22-09:13:27

Yang-Bae Park

오! 사실 찝찝했던게 그 부분이었습니다.

제가 mod_url 소스 내용을 확실히 몰라서 약간 회피(?)하던 방법으로 처리해버렸죠. ^^;
정균님께서 확실히 해결해주시는군요.

일단 컴파일러가 VC++ 컴파일러이기 때문에 /D WINNT 옵션을 추가하고 컴파일하니 아래의 로그와 같이 잘 작동합니다.


[EUC-KR 클라이언트]
[Sat Dec 22 08:56:05 2007] [debug] mod_url.c(779): [client 127.0.0.1] Pre URI Converting
[Sat Dec 22 08:56:05 2007] [debug] mod_url.c(253): [client 127.0.0.1] check_redurl_iconv: iconv convert start -------------------
[Sat Dec 22 08:56:05 2007] [debug] mod_url.c(270): [client 127.0.0.1] mod_url configuration: ServerEncoding UTF-8, ClientEndoding EUC-KR
[Sat Dec 22 08:56:05 2007] [debug] mod_url.c(304): [client 127.0.0.1] Oirg => /\xc7\xd1\xb1\xdb.txt (9)
[Sat Dec 22 08:56:05 2007] [debug] mod_url.c(306): [client 127.0.0.1] Fixed => /\xed\x95\x9c\xea\xb8\x80.txt (11)
[Sat Dec 22 08:56:05 2007] [debug] mod_url.c(308): [client 127.0.0.1] Check Code => 0
[Sat Dec 22 08:56:05 2007] [debug] mod_url.c(310): [client 127.0.0.1] check_redurl_iconv: iconv convert end -------------------
[Sat Dec 22 08:56:05 2007] [debug] mod_url.c(811): [client 127.0.0.1] pre finfo.filetype => 0
[Sat Dec 22 08:56:05 2007] [debug] mod_url.c(813): [client 127.0.0.1] pre realpath => Don't support on WINNT mode
[Sat Dec 22 08:56:05 2007] [debug] mod_url.c(815): [client 127.0.0.1] pre r->uri => /\xed\x95\x9c\xea\xb8\x80.txt
[Sat Dec 22 08:56:05 2007] [debug] mod_url.c(817): [client 127.0.0.1] pre r->unparsed_uri => /%ED%95%9C%EA%B8%80.txt
[Sat Dec 22 08:56:05 2007] [debug] mod_url.c(819): [client 127.0.0.1] pre r->parsed_uri.path => /\xed\x95\x9c\xea\xb8\x80.txt


[UTF-8 클라이언트]
[Sat Dec 22 08:57:25 2007] [debug] mod_url.c(779): [client 127.0.0.1] Pre URI Converting
[Sat Dec 22 08:57:25 2007] [debug] mod_url.c(253): [client 127.0.0.1] check_redurl_iconv: iconv convert start -------------------
[Sat Dec 22 08:57:25 2007] [debug] mod_url.c(270): [client 127.0.0.1] mod_url configuration: ServerEncoding UTF-8, ClientEndoding EUC-KR
[Sat Dec 22 08:57:25 2007] [debug] mod_url.c(304): [client 127.0.0.1] Oirg => /\xed\x95\x9c\xea\xb8\x80.txt (11)
[Sat Dec 22 08:57:25 2007] [debug] mod_url.c(306): [client 127.0.0.1] Fixed => / (1)
[Sat Dec 22 08:57:25 2007] [debug] mod_url.c(308): [client 127.0.0.1] Check Code => -1
[Sat Dec 22 08:57:25 2007] [debug] mod_url.c(310): [client 127.0.0.1] check_redurl_iconv: iconv convert end -------------------
[Sat Dec 22 08:57:25 2007] [debug] mod_url.c(811): [client 127.0.0.1] pre finfo.filetype => 0
[Sat Dec 22 08:57:25 2007] [debug] mod_url.c(813): [client 127.0.0.1] pre realpath => Don't support on WINNT mode
[Sat Dec 22 08:57:25 2007] [debug] mod_url.c(815): [client 127.0.0.1] pre r->uri => /
[Sat Dec 22 08:57:25 2007] [debug] mod_url.c(817): [client 127.0.0.1] pre r->unparsed_uri => /
[Sat Dec 22 08:57:25 2007] [debug] mod_url.c(819): [client 127.0.0.1] pre r->parsed_uri.path => /


아래는 컴파일시에 발생하는 사소한 Warning 입니다.
..\mod_url.c(562) : warning C4101: 'realstat' : unreferenced local variable
..\mod_url.c(561) : warning C4101: 'rootlen' : unreferenced local variable
..\mod_url.c(561) : warning C4101: 'urilen' : unreferenced local variable
..\mod_url.c(561) : warning C4101: 'real_len' : unreferenced local variable


혹시나 몰라서 수정된 win32_compile.bat 파일도 같이 올립니다.

07.12.22-09:13:27

김정균

음. apache2 에서 encoding을 변환하는 것이 ap_hook_fixups 이전인지 이후인지를 확인해 봐야 할 것 같군요. 이전이면 굳이 뺄 필요가 없을 것 같기도 하고..

그리고, utf8 로된 파일이 존재할 경우 처리를 어떻게 할 것인지 여부를 확인해야 겠죠. ap_hook_fixups 이후에 apache 가 변환을 하는 것이라면 파일 시스템상의 utf8이 존재하면 서비스가 불가능 하다는 결론이 나기 때문에 신경쓸 필요가 없고, ap_hook_fixups 이전에 변환을 한다면 파일 시스템상에 utf8 파일이 있을 경우 처리가 가능 할 것이고요.

빌드 환경이 없으니 꽤 답답하기는 하네요. ^^;

07.12.24-16:32:56

김정균

일단 현재까지의 사항에 대하여 CVS 에 commit 하였습니다.

http://kldp.net/plugins/scmcvs/cvsweb.php/mod_url/apache2/mod_url.c.diff?r1=1.12;r2=1.13;cvsroot=modurl
에 변경 사항이 반영되어 있으니 참고 하십시오.

07.12.24-17:41:14

김정균

"State" was changed from "Open" to "Closed"
"Tracker Type" was changed from "Bug Tracking" to "Patch Tracking"

09.11.27-05:37:03