2014-11-30 3 views
0

Я пытаюсь запустить локальный сервер, который (на данный момент) служит в основном статическом контенте с машины Windows 7. Проблема заключается в том, что много содержания организовано с использованием символических ссылок, и когда я пытаюсь и обслуживать эти файлы с помощью CherryPy, они всегда возвращаются:Как заставить CherryPy следовать символическим ссылкам?

запрашиваемый ресурс возвращается больше байт, чем заявленный Content-Length.

Предположительно это происходит потому, что CherryPy проверяет размер символической ссылки на диске, использует это для Content-Length, а затем, когда он пытается получить доступ к файлу, Windows дает ему полный размер файла и т.д. они не совпадают. Я предполагаю, что эта проблема была решена в какой-то момент, и что есть опция конфигурации, о которой я просто не знаю, но я не могу найти полный список всех параметров конфигурации CherryPy. У кого-то есть хорошее решение для этого?

ответ

2

Насколько я вижу, этот вопрос не имеет ничего общего с CherryPy. Если вы посмотрели cherrypy.lib.static.serve_file, вы увидите следующее.

try: 
    st = os.stat(path) 
except OSError: 
    if debug: 
     cherrypy.log('os.stat(%r) failed' % path, 'TOOLS.STATIC') 
    raise cherrypy.NotFound() 

# ... 

# Set Content-Length and use an iterable (file object) 
# this way CP won't load the whole file in memory 
content_length = st.st_size 
fileobj = open(path, 'rb') 
return _serve_fileobj(fileobj, content_type, content_length, debug=debug) 

документация Python заявляет о os.stat:

Выполните эквивалент системного вызова стат() на данном пути. (Этой функция следует симлинка; к стат потребительной символической lstat().)

Википедия points to restrictions в создании символических ссылок, как только повышенные администраторы могут создавать их. Таким образом, это не похоже на общую функцию. Существует также несколько типов этих ссылок, способы их включения, поэтому они могут вести себя по-разному.

В любом случае это легко проверить, действительно ли os.stat следует символические ссылки, которые вы имеете на вашей платформе:

import os 
print os.stat('/path/to/filename').st_size 

Если вы не думаю, что результат является правильным, я хотел бы предложить вам подать отчет Python bug tracker ,

Смежные вопросы