본문 바로가기

카테고리 없음

CEF4Delphi - Request 정보 얻기

크로미움을 통해 웹페이지를 네비게이션 시키는 경우 네비게이션 되기 전에 웹페이지 요청 정보를 획득 할 수 있습니다.

절차는 다음과 같습니다.

1. 웹브라우저에 네비게이션이 시작된다.

2. 웹브라우저(Chromium)의 "OnBeforeResourceLoad" 이벤트에서 요청 정보가 "request : ICefRequest" 에 담긴다.

3. request 객체를 이용해 다음과 같은 정보를 획득할 수 있다.

  • URL (request.url): 네비게이션될 URL
  • Method(request.Method) : Get/Post 방식의 요청 방법
  • HeaderMap : 요청 헤더 키쌍 정보
  • PostData : Method가 Post방식일 경우 PostData 정보

4. Header Map 얻기

//request 객체로 부터 요청 헤더 정보를 얻는다(Key = Value)
function GetChromiumHeaderMap(const request : ICefRequest) : String;
var
  TempHeaderMap : ICefStringMultimap;
  i             : NativeUInt;
  headerSL      : TStringList;
begin
  try
  	//키쌍 정보를 얻을 문자열목록 객체 생성
    headerSL := TStringList.Create;
    TempHeaderMap := TCefStringMultimapOwn.Create;
    request.GetHeaderMap(TempHeaderMap);

    if (TempHeaderMap <> nil) and (TempHeaderMap.Size > 0) then
      begin
        i := 0;
        while (i < TempHeaderMap.Size) do
          begin
            //결과를 Key=Value 형식으로 저장
            headerSL.Add(TempHeaderMap.Key[i] + '=' + TempHeaderMap.Value[i]);
            inc(i);
          end;
      end;
      result := headerSL.Text;
  except
    on e : exception do
      begin
      	//DEBUG 지시자가 있는 경우만 예외처리 핸들러 동작
        if CustomExceptionHandler('GetChromiumHeaderMap', e) then 
        begin
	      	headerSL.Free;
    	    raise;
       	end;
      end;
  end;
  headerSL.Free;
end;

5. PostData 얻기

//PostData 스트림 정보를 문자열로 변환한다.
function ChromiumPostDataToBytes(const aElement : ICefPostDataElement) : String;
var
  TempStream : TStringStream;
  TempBuffer : TBytes;
  TempSize   : NativeUInt;
begin
  result := '';
  TempStream := nil;
  TempBuffer := nil;

  try
    try
      if (aElement <> nil) and (aElement.GetBytesCount > 0) then
        begin
          SetLength(TempBuffer, aElement.GetBytesCount);
          TempSize := aElement.GetBytes(aElement.GetBytesCount, @TempBuffer[0]);

          if (TempSize > 0) then
            begin
              TempStream := TStringStream.Create;
              TempStream.WriteBuffer(TempBuffer, TempSize);
              TempStream.Seek(0, soBeginning);
              result := TempStream.ReadString(TempSize);
            end;
        end;
    except
      on e : exception do
        if CustomExceptionHandler('ChromiumPostDataToBytes', e) then raise;
    end;
  finally
    if (TempStream <> nil) then FreeAndNil(TempStream);
    SetLength(TempBuffer, 0);
  end;
end;

//Chromium의 Request객체로 부터 POSTDATA 값을 얻는다.
function GetChromiumPostData(const request : ICefRequest) : String;
var
  postDataSL    : TStringList;
  TempPostData  : ICefPostData;
  TempElement   : ICefPostDataElement;
  TempList      : IInterfaceList;
  i             : integer;
begin
  try
    result := '';
    postDataSL := TStringList.Create;
    TempPostData := request.PostData;

    if (TempPostData <> nil) and (TempPostData.GetCount > 0) then
      begin
        TempList := TempPostData.GetElements(TempPostData.GetCount);
        i        := 0;
       while (i < TempList.Count) do
          begin
            TempElement := TempList.Items[i] as ICefPostDataElement;
            case TempElement.GetType of
              PDE_TYPE_BYTES :
                  postDataSL.Add(ChromiumPostDataToBytes(TempElement));
              PDE_TYPE_FILE :
                begin
                end
              else
                ;
            end;
            inc(i);
          end;
      end;
      result := postDataSL.Text;
  except
    on e : exception do
      if CustomExceptionHandler('GetChromiumPostData', e) then
      begin
        postDataSL.Free;
        raise;
      end;
  end;
  postDataSL.Free;
end;
처리결과

URL : https://linkhelp.clients.google.com/tbproxy/lh/wm?sourceid=wm&url=https%3A%2F%2Fwww.w3schools.com%2Fphp%2Fshowphp.asp%3F&hl=en&site=https%3A%2F%2Fwww.w3schools.com&error=http404&js=true
Method : GET
Main frame : True
HeaderMap : 
Accept=*/*
DNT=1
Intervention=<https://www.chromestatus.com/feature/5718547946799104>; level="warning"
Sec-Fetch-Mode=no-cors
Sec-Fetch-Site=cross-site
User-Agent=Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36

PostData :