# apache httpd 에 사용 할 C/C++ 모듈 예)mod_ysoftman.so 개발시
# ap_hook_handler 를 통해 request_rec* req (사용자 요청 레코드)를 받을 수 있다.
# scheme(http, ftp,..) 종류를 파악해보자
# httpd.h 에 명시된 매크로 사용 하면 된다.(v2.2 이상)
ap_run_http_scheme(req)
# 그런데 gtest 빌드시 다음 에러가 발생한다.
undefined reference to `ap_run_http_scheme'
# gtest 컴파일은 -lapreq2 -lapr-1 라이브러리만 링크하게 되는데
# ap_run_http_scheme 와 같이 ap_ 로 시작하는 함수들은
# httpd daemon 루틴으로 httpd 데몬 실행 환경에서만 사용할 수 있다.
# 다음 exp 파일에서 각각 라이브러리에서 사용하는 함수들을 확인할 수 있다.
apache/modules/httpd.exp
apache/lib/apr.exp, aprutil.exp
# httpd library 를 -l 링크하지 않으면 ap_xxx 함수들을 찾을 수 없게 된다.
##########
# 삽질~
# ap_xx 대신 apr(apache runtime) 라이브러리에서 비슷한 함수을 찾아 봤다.
# apr 라이브러리에서는 apr_uri_parse() 로 scheme 를 알 수 있다.
# 하지만 req->uri, unparsed_uri,.. 등을 찍어보면 scheme 정보가 없다.
fprintf(stderr, "ysoftman unparsed_uri %s\n", req->unparsed_uri);
fprintf(stderr, "ysoftman uri %s\n", req->uri);
fprintf(stderr, "ysoftman the_request %s\n", req->the_request);
fprintf(stderr, "ysoftman path_info %s\n", req->path_info);
fprintf(stderr, "ysoftman args %s\n", req->args);
fprintf(stderr, "ysoftman protocol %s\n", req->protocol);
fprintf(stderr, "ysoftman method %s\n", req->method);
fprintf(stderr, "ysoftman content_type %s\n", req->content_type);
fprintf(stderr, "ysoftman user %s\n", req->user);
fprintf(stderr, "ysoftman ap_auth_type %s\n", req->ap_auth_type);
# 따라서 다음과 같이 req->pool 에서 찾는게 아니라 scheme 이 포함된 url 스트링을 주고 이를 파싱하는데만 쓸 수 있다.
apr_uri_t parsed_uri;
apr_status_t ret = apr_uri_parse(req->pool, "http://ysoftman.com", &parsed_uri);
if (ret != APR_SUCCESS)
{
return "";
}
fprintf(stderr, "ysoftman parsed_uri.scheme %s\n", parsed_uri.scheme);
##########
# 해결방법 - gtest 에서 ap_run_http_scheme 을 찾지 않도록 자체 구현하면 된다.
# gtest 코드에서 다음과 mockup 함수로 선언하고
# MOCK_CONST_METHOD + 파라미터 개수 + (함수명, 리턴타입())
MOCK_CONST_METHOD0(scheme, std::string());
# cpp 파일에 C 스타일로 컴파일도록하고
# 의미없는 ap_run_http_scheme() 를 구현해놓는다.
#ifdef __cplusplus
extern "C" {
#endif
char *ap_run_http_scheme(request_rec *r)
{
return NULL;
}
#ifdef __cplusplus
}
#endif