2013-10-07 5 views
1

У меня есть следующая проблема.BaseHttpServer вернул код 404 с кириллицей

Я использовал BaseHttpServer.

class ReqHandler(BaseHTTPServer.BaseHTTPRequestHandler): 
    def __init__(self, request, client_address, server): 
     BaseHTTPServer.BaseHTTPRequestHandler.__init__(self, request, client_address, server) 

    def do_GET(self): 
     self.performReq(self.path.decode('utf-8')) 

    def performReq (self, req): 
     curDir = os.getcwd() 
     fname = curDir + '/' + self.path[1:] 
     try: 
      self.send_response(200,"Ok!") 
      ext = os.path.splitext(self.path)[1] 
      self.send_header('Content', 'text/xml; charset=UTF-8') 
      self.end_headers() 
      f = open(fname, 'rb') 
      for l in f: 
       self.wfile.write(l) 
      f.close() 
      print 'file '+fname+" Ok" 
     except IOError: 
      print 'no file '+fname 
      self.send_error(404) 

if __name__=='__main__': 
    server = BaseHTTPServer.HTTPServer(('',8081), ReqHandler) 
    print('server ok!') 
    server.serve_forever() 

Если путь к файлу содержит кириллицу.

http://localhost:8081/ТРА/Понедельник/Пн.doc) 

Я получаю код 404.

Спасибо.

Screenshot browser

Screenshot server

+0

Как 'fname' установить? Изменяется ли параметр 'fname' с помощью пути запроса? –

+0

Я был обновлен. Добавить браузер скриншотов и консоль, а также добавить fname в код. –

+0

Можем ли мы увидеть больше кода? Как запустить сервер? Каков весь класс обработчиков? –

ответ

0

URL-адреса не только кодируется как UTF-8; они также кодируются URL. Расшифруйте, что тоже с помощью urllib.urlunquote() function:

from urllib import urlunquote 

self.performReq(unlunquote(self.path).decode('utf-8')) 

Демо:

>>> from urllib import unquote 
>>> path = '/%D0%A2%D0%A0%D0%90/%D0%9F%D0%BE%D0%BD%D0%B5%D0%B4%D0%B5%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA/%D0%9F%D0%BD.doc' 
>>> unquote(path).decode('utf8') 
u'/\u0422\u0420\u0410/\u041f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a/\u041f\u043d.doc' 
>>> print unquote(path).decode('utf8') 
/ТРА/Понедельник/Пн.doc 
+0

Спасибо! Большое спасибо!!! –

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