2014-11-25 7 views
1

TIdHTTPServer 나는 태그에 <script language="javascript"> 태그가있는 브라우저로 HTML 파일의 자바 스크립트 코드를 보내는 TIdHTTPServer입니다. html 파일에 액세스 할 수 없기 때문에 내용을 변경할 수 없습니다.Indy TIdHTTPServer OnCommandGet html로 된 자바 스크립트가 실행되지 않습니다.

procedure TMainForm.HTTPServerCommandGet(AContext: TIdContext; 
    ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); 
var 
    responseMemoryStream : TMemoryStream; 
begin 
    responseMemoryStream := TMemoryStream.Create; 
    try 
    AResponseInfo.ContentType := 'text/html'; 
    AResponseInfo.ContentEncoding := 'UTF-8'; 
    AResponseInfo.CharSet := 'UTF-8'; 
    responseMemoryStream.LoadFromFile(ExtractFilePath(Application.ExeName) + 'index.html'); 
    AResponseInfo.ContentStream := TMemoryStream.Create; 
    TMemoryStream(AResponseInfo.ContentStream).LoadFromStream(responseMemoryStream); 
    finally 
    responseMemoryStream.Free; 
    end; 
end; 

난 후 가끔 자바 스크립트를로드하는 인터넷 브라우저에서 GET 명령을 할 때하지만 그렇지 않을 때도 있습니다 - 내가 사용하는 경우 :이 같은 브라우저에이 파일의 내용을 보낼 HTTPServerCommandGet를 사용 파이어 폭 아무런 문제가 없지만, 크롬 또는 을 사용하면 자바 스크립트가 실행되지 않습니다. 거기에 AResponseInfo 변수로 어떻게 든 자바 스크립트 코드의 실행을 강제하는 방법이 있나요 아니면 내가이 문제를 해결하기 위해 할 수있는 무엇입니까?

이는 index.html의 일부 모습입니다 :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <meta name="keywords" content="" /> 
    <meta name="description" content="" /> 
    <meta charset=utf8 /> 
    <title>My title</title> 
    <script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script> 
    <script language="javascript"> 
     var map; 
     var flag_for_map_massage = 0; 
     var map_marker = 0; 
     function initmap() 
     { 
      var html; 
      var map_divtxt = "<div id=\"map_canvas\" style=\"width:200px;height:150px;\" ></div>"; 
      document.getElementById("google_map").innerHTML = map_divtxt; 
      var latlng = new google.maps.LatLng(100.12345, 200.12345); 

      var options = { 
       zoom: 17, 
       center: latlng, 
       mapTypeId: google.maps.MapTypeId.ROADMAP 
      }; 
      var map1 = new google.maps.Map(document.getElementById("map_canvas"), options); 

      var html = "<table>" + 
        "<tr><td>GMBH Address</td> </tr>"; 

      infowindow = new google.maps.InfoWindow({ 
       content: html 
      }); 
      var marker1 = new google.maps.Marker({ 
       position: new google.maps.LatLng(100.12345, 200.12345), 
       map: map1 

      }); 
      //  infowindow.open(map1, marker1); 
      google.maps.event.addListener(marker1, "click", function() { 
       infowindow.open(map1, marker1); 
      }); 
     } 

    </script> 
</head> 
<body onload="initmap();"> 
    <div class="entry"> 
    <div id="google_map"> 
    </div> 
    </div> 
</body> 
</html> 
+0

이 코드 조각이 "var latlng = new google.maps.LatLng (100.12345, 200.12345);'''OnCommandGet''을 보낼 때''(그리고 그 이후의 모든 것들은) 실행될 수 없지만 브라우저 자체에서 파일을 열면 괜찮습니다. –

+0

@whosrdaddy - 아무데도 - 분명히 자동으로로드됩니다. (파일을 로컬로로드 한 후 브라우저에서 요소를 검사 할 때 ""태그에 3 개의 Google Maps API ''', ''파이어 폭스''에서만 작동했습니다.''IE''와''Chrome''은 맵을로드하지 못했습니다. –

답변

4

모든 할 수있는 서버가 브라우저, 아무것도 더에 HTML을 제공합니다. HTML을 처리하고, 외부 자원을 검색하고, 스크립트를 실행하는 것은 브라우저의 책임입니다. 브라우저가 올바르게 작동하지 않으면 HTML/스크립트가 시작될 가능성이 있습니다. 그게 당신이 보내는 데이터를 손상시키지 않는 한 귀하의 서버와 관련이 없습니다.

이와 같이 과도한 코드 인 OnCommandGet 코드에는 두 개의 스트림을 사용할 필요가 없습니다. 한 스트림으로 충분합니다. 또한 utf-8은 유효한 ContentEncoding 값이 아니므로이를 제거해야합니다. 또한

procedure TMainForm.HTTPServerCommandGet(AContext: TIdContext; 
    ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); 
begin 
    AResponseInfo.ContentType := 'text/html'; 
    AResponseInfo.CharSet := 'utf-8'; 
    AResponseInfo.ContentStream := TMemoryStream.Create; 
    TMemoryStream(AResponseInfo.ContentStream).LoadFromFile(ExtractFilePath(Application.ExeName) + 'index.html'); 
end; 

:

procedure TMainForm.HTTPServerCommandGet(AContext: TIdContext; 
    ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); 
begin 
    AResponseInfo.ContentType := 'text/html'; 
    AResponseInfo.CharSet := 'utf-8'; 
    AResponseInfo.ContentStream := TIdReadFileExclusiveStream.Create(ExtractFilePath(Application.ExeName) + 'index.html'); 
end; 

을 그리고, 물론, 브라우저가 실제로 index.html를 요청하는 경우가 ARequestInfo.Document 속성에주의를 기울이지 만 index.html를 제공하고 있는지 확인하고

이 시도 서버에있는 다른 파일이 아닙니다.

2

Indy10의 IdCustomHTTPServer.pas에 버그가 있습니다.

설정 AResponseInfo.Charset 값이 작동하지 않습니다. 다음 줄 (Pas 파일의 2141 줄)이 Charset 변수를 무시하기 때문입니다. , 수정에서 (복사 아래 두 개의 파일을 추가하려면

if ContentType = '' then begin 
    if (ContentText <> '') or (Assigned(ContentStream)) then begin 
     ContentType := 'text/html; charset=ISO-8859-1'; {Do not Localize} 

"C : \ Program 파일 (x 86) \ 엠바 카데 \ 스튜디오 \ 16.0 \ 소스 \ Indy10을 \ 코어"당신의 프로젝트 디렉토리는 다음 프로젝트에 추가) :

IdCustomHTTP.pas

IdCompilerDefines.inc

ContentType := 'text/html; charset='+Charset; 
,536로 라인 2141을 수정

;-)