PHP Curl을 이용해서 Response header 값을 가져오기

HYEONG HWAN, MUN/ 10월 18, 2014/ 미분류/ 0 comments

https://blog.lael.be/post/93

이번에 다음커뮤니케이션 시스템과 회원연동을 할 일이 있었다.

다음커뮤니케이션은 로그인인증시 결과값이 헤더에 나타난다.

 

많은 문서들이 curl_getinfo 를 사용하도록 하고 있지만 이것으로는 response 헤더값을 얻을 수 없다.

curl_getinfo 는 request에 대한 헤더이지 response 의 헤더가 아니다.

참고로 아래의 구문을 추가하고, curl_getinfo를 하면 request header 를 살펴볼 수 있다.

curl_setopt($ch, CURLINFO_HEADER_OUT, true);

 

따라서 response header 를 처리하는 함수를 만들었다.

 

request로 raw response header를 받고 본문을 잘라내어 버린다음 헤더내용만 파싱하여 배열로 추출한다.


function make_curl($url, $post_field){
    $request_timeout = 10; // 1 second timeout
    $request = curl_init();
    curl_setopt($request, CURLOPT_URL, $url);
    curl_setopt($request, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($request, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($request, CURLOPT_TIMEOUT, $request_timeout);
    curl_setopt($request, CURLOPT_CONNECTTIMEOUT, $request_timeout);
    curl_setopt($request, CURLOPT_COOKIEJAR, 'curl_cookie/cookie_'.$_SERVER['REMOTE_ADDR'].'_.txt');
    curl_setopt($request, CURLOPT_COOKIEFILE, 'curl_cookie/cookie_'.$_SERVER['REMOTE_ADDR'].'_.txt');
    curl_setopt($request, CURLOPT_POST, 1);
    curl_setopt($request, CURLOPT_HEADER, 1);//헤더를 포함한다.
    curl_setopt($request, CURLOPT_POSTFIELDS, $post_field);
    curl_setopt($request, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded', 'Connection: Close'));
    $result = curl_exec($request);
    return $result;
}

 


function get_http_header_as_array($rawheader){
    $header_array = array();
    $header_rows = explode("\n",$rawheader);
    for($i=0;$i<count($header_rows);$i++){
        $fields = explode(":",$header_rows[$i]);

        if($i != 0 && !isset($fields[1])){//carriage return bug fix.
            if(substr($fields[0], 0, 1) == "\t"){
                end($header_array);
                $header_array[key($header_array)] .= "\r\n\t".trim($fields[0]);
            }
            else{
                end($header_array);
                $header_array[key($header_array)] .= trim($fields[0]);
            }
        }
        else{
            $field_title = trim($fields[0]);
            if (!isset($header_array[$field_title])){
                $header_array[$field_title]=trim($fields[1]);
            }
            else if(is_array($header_array[$field_title])){
                    $header_array[$field_title] = array_merge($header_array[$fields[0]], array(trim($fields[1])));
                }
            else{
                $header_array[$field_title] = array_merge(array($header_array[$fields[0]]), array(trim($fields[1])));
            }
        }
    }
    return $header_array;
}

 


if ($curl_result !== '') {
    $split_result = split("\r\n\r\n", $curl_result, 2);
    $header = $split_result[0];
    //$body = $split_result[1];
    $header_arr = get_http_header_as_array($header);
}

 

j6

 


 

header 파싱 예시
j4

j5

Leave a Comment

작성하신 댓글은 관리자의 수동 승인 후 게시됩니다.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
*
*