tclhttpd.3.5.1 показывает исходный код страницы (Windows) - PullRequest
0 голосов
/ 23 марта 2012

Я играю с веб-сервером tclhttpd и обнаружил странную ошибку

  1. Я запускаю tclhttpd с портом по умолчанию 8015
  2. Откройте Firefox и перейдите к http://localhost:8015

Я вижу источник моего файла index.html вместо веб-страницы.

index.html прост (<и> пропущены):

  html 
  head 
    title
      TEST 
    /title
  /head
  body
   H1 TEST HEADER /H1
  /body
  /html

Есть идеи?

Я проверил с помощью локона:

* About to connect() to localhost port 8015 (#0)
*   Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 8015 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.21.3 (i386-pc-win32) libcurl/7.21.3 
  OpenSSL/0.9.8q zlib/1.2.5
> Host: localhost:8015
> Accept: */*

Ответ сервера

 HTTP/1.1 200 Data follows
 Date: Thu, 12 Apr 2012 14:16:47 GMT
 Server: Tcl-Webserver/3.5.1 May 27, 2004
 Content-Type: text/plain
 Content-Length: 130
 Last-Modified: Thu, 12 Apr 2012 14:14:30 GMT

Итак, tclhttpd возвращает text / plain вместо text / html

Корпус Linux

Я пытался проверить, что случилось бы с Linux.

Поскольку tclkttpd упакован в комплект, я провел такой же тест под Linux. Похоже, все работает отлично.

curl -G -v localhost: 8015

* About to connect() to localhost port 8015 (#0)
*   Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 8015 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.21.7 (i686-pc-linux-gnu) libcurl/7.21.7
  OpenSSL/1.0.0d zlib/1.2.5 libssh2/1.2.7
> Host: localhost:8015
> Accept: */*

Ответ сервера

 HTTP/1.1 200 Data follows
 Date: Thu, 12 Apr 2012 17:25:29 GMT
 Server: Tcl-Webserver/3.5.1 May 27, 2004
 Content-Type: text/html
 Content-Length: 125
 Last-Modified: Thu, 12 Apr 2012 17:14:04 GMT

Глубокое исследование

Я изменил некоторые исходные файлы, чтобы получить больше информации:

proc Mtype {path} {
   global MimeType

    set ext [string tolower [file extension $path]]
    Stderr "Mtype: path $path ext $ext"
    if {[info exist MimeType($ext)]} {
    Stderr "MimeType($ext) exists."
    Stderr "Print MimeType "
    set lst [lsort [array names MimeType]]
    foreach {i}  $lst {
        Stderr " $i $MimeType($i)"
    }
return $MimeType($ext)
  } else {
Stderr "Mimetype not found. ext $ext"
    Stderr "Print MimeType "
    set lst [lsort [array names MimeType]]
    foreach {i}  $lst {
        Stderr " $i $MimeType($i)"
    }

return text/plain
}
}

Когда я запрашиваю http://localhost:8015 Я получил следующий вывод:

  • Linux
     Mtype: path /home/a2/src/tcl/tcl_www/doc/index.html ext .html
     MimeType(.html) exists.
     Print MimeType 
     text/plain
     .ai application/postscript
     .aif audio/x-aiff
     .aifc audio/x-aiff
     ....
     .hqx application/mac-binhex40
     .htm text/html
     .html text/html
     .i86pc application/octet-stream
     ...
     Default cmd Doc_text/html
  • Windows
     Look for Tcl proc whos name match the MIME Content-Type
     Mtype: path M:/apr/tcl_www/doc/index.html ext .html
     Mimetype not found. ext .html
     Print MimeType
      .man application/x-doctool
     Mtype M:/apr/tcl_www/doc/index.html  returns Doc_text/plain

Похоже на проблемы с чтением mime.types

Ответы [ 5 ]

1 голос
/ 14 апреля 2012

Я проверил с помощью свежих tclkitsh и tclhttpd

Все работает.

Если я использую мою "старую" версию tclkitsh-win32.upx.exe, я получаю text / plain вместо text / html

Похоже, в моем старом упакованном интерпретаторе есть ошибка, которая приводит к проблеме с чтением mime.types.

1 голос
/ 23 марта 2012

Вы должны проверить трафик, сгенерированный tclhttpd, чтобы увидеть, действительно ли он говорит в заголовках HTTP своего ответа, что тип полезной нагрузки - "text / html".

Использование Fiddler , sockspy , Microsoft Network Monitor или Wireshark .

Также есть более легкие средства отладки для браузеров. Я почти уверен, что Firebug продемонстрирует вам эту информацию, и даже простые Live HTTP Headers могут это сделать.

В IE также есть некоторый аддон отладки (похожий на Firebug), за который мне лень гуглить.

0 голосов
/ 13 апреля 2012

Проблема найдена.

httpdthread.tcl

# Core modules
package require httpd           ;# Protocol stack
package require httpd::version  ;# Version number
package require httpd::url  ;# URL dispatching
package require httpd::mtype    ;# Mime types

# Search for mime.types either right in Config(lib), or down
# one level in the installed tclhttpd subdirectory
foreach path [list \
    [file join $Config(lib) mime.types] \
    [glob -nocomplain [file join $Config(lib) tclhttpd* mime.types]] \
    ] {
    if {[llength $path] > 0} {
        set path [lindex $path 0]
       }
    if {[file exists $path]} {
      Mtype_ReadTypes $path
      break
    }
}

Этот код проверяет файл mime.types по следующим путям: - /home/a2/..../tclhttpd3.5.1.kit/bin/../lib - /home/a2/..../tclhttpd3.5.1.kit/bin/../lib/tclhttpd*/mime.types

Linux

glob -nocomplain /home/..../tclhttpd3.5.1.kit/bin/../lib/tclhttpd*/mime.types]

отлично работает и возвращает

/home/....tclhttpd3.5.1.kit/bin/../lib/tclhttpd3.5.1/mime.types

Windows

 glob -nocomplain /home/..../tclhttpd3.5.1.kit/bin/../lib/tclhttpd*/mime.types]

не удалось.

Я пробовал разные маски:

  • tclhttpd *
  • tclhttpd *. *
  • tclhttpd *. .

ничего не работает

Наконец я изменил код:

foreach path [list \
    [file join $Config(lib) mime.types] \
    [glob -nocomplain [file join $Config(lib) tclhttpd* mime.types]] \
    [file join $Config(lib) [lindex [Httpd_Version] 0] mime.types] 
    ] {
    if {[llength $path] > 0} {
        set path [lindex $path 0]
       }
    if {[file exists $path]} {
      Mtype_ReadTypes $path
      break
    }
}

строка

[file join $Config(lib) [lindex [Httpd_Version] 0] mime.types]

создать путь:

/home/..../tclhttpd3.5.1.kit/bin/../lib/tclhttpd3.5.1/mime.types

Теперь tclhttpd может найти mime.types под Windows.

И, похоже, эта проблема возникла, только если glob ищет в файле statkit.

0 голосов
/ 12 апреля 2012

Причина того, что curl получает text/plain вместо text/html, может заключаться в том, что он передает */* в заголовок Accept своих HTTP-запросов, в то время как обычно браузеры размещают там более сложную конструкцию - например, мой FF 11.0 использует text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8.

Можно заметить, что в случае FF text/html (вместе с типами XHTML и XML) назначается более высокое предпочтение (0,9), а всем остальным (*/*) назначается более низкое предпочтение (0,8).

Соответствующий HTTP-сервер должен попытаться обслужить запрошенный ресурс в формате, указанном как предпочтительный в запросе клиента.

Вероятно, это также могло бы пролить некоторый свет на эту оригинальную разницу в поведении между IE и FF.

0 голосов
/ 12 апреля 2012

Я думаю, tclhttpd автоматически использует text/html, если файл заканчивается на .html. Вы должны правильно прочитать эту запись в вики на wiki.tcl.tk о mime-type .

Пробовал сам с index.html и все заработало. Чем я создал index.tml, и это сработало.

[html::description "Test"]
[Doc_Dynamic]
[html::head "hello"]
<body>
test
</body>
</html>

Вот часть заголовка ответа:

HTTP/1.1 200 Data follows
Content-Length: 137
Date: Thu, 12 Apr 2012 16:47:53 GMT
Server: Tcl-Webserver/3.5.1 May 27, 2004
Connection: Close
Content-Type: text/html
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...