크로미움을 통해 웹페이지를 네비게이션 시키는 경우 네비게이션 되기 전에 웹페이지 요청 정보를 획득 할 수 있습니다.
절차는 다음과 같습니다.
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 :