扭曲的服务器返回带有意外字体的文本
Twisted server returning text with unexpected fonts
我当前扭曲的服务器代码。这是一个简单的实验,采用 url 编码请求并将它们转换为 JSON 之类的字符串,然后 return.
from twisted.web.server import Site
from twisted.web.resource import Resource
from twisted.internet import reactor
import urllib.parse
class FormPage(Resource):
isLeaf = True
def render_GET(self, request):
print(request.uri)
x = (request.uri).decode('ascii')
x = x[1:]
x = todi(x)
return x.encode('ascii')
def todi(st):
if len(st) == 0:
return '{}'
if st[len(st)-1] == '/':
st = st[:-1]
if len(st) == 0:
return '()'
if st[0] == '?':
st = st[1:]
st = urllib.parse.parse_qsl(st)
return str(dict(st))
factory = Site(FormPage())
reactor.listenTCP(80, factory)
reactor.run()
我注意了接收简单文本时浏览器显示的字体。例如这个站点: http://icanhazip.com/ 当你访问时,字体看起来像 consola
字体(MS记事本的默认字体)。但是,当我访问我的网站时,我的浏览器显示的字体类似于 Times New Roman
.
此后我进行了一些调试,例如强制网站 return 一个简单的字符串,但没有什么能阻止 twisted 给我丑陋的字体。
在这里,有一个example。
另请注意,我在 Chrome 中执行了操作,您可以在其中右键单击并使用 "View page source" 按钮。相信我,我的两个例子都是根据那个简单的原始文本。
查看您的 Twisted 服务器返回的 headers 并将它们与其他网站返回的那些进行比较,后者指定 Content-Type: text/plain; charset=UTF-8
,而 Twisted 服务器未指定 Content-Type
完全没有。
当内容类型指定为 text/plain
与未指定的内容类型时,您的浏览器(我发现它与 Firefox 相同)使用不同的字体。
在 Twisted 中,您可以像这样用 request.setHeader()
设置 Content-Type
header:
def render_GET(self, request):
print(request.uri)
x = (request.uri).decode('ascii')
x = x[1:]
x = todi(x)
request.setHeader('Content-Type', 'text/plain; charset=UTF-8')
return x.encode('UTF-8')
因为这设置了 Content-Type
,所以它也可以指定字符集。 UTF-8(可能)是首选,并且响应文本的编码方式类似。
我当前扭曲的服务器代码。这是一个简单的实验,采用 url 编码请求并将它们转换为 JSON 之类的字符串,然后 return.
from twisted.web.server import Site
from twisted.web.resource import Resource
from twisted.internet import reactor
import urllib.parse
class FormPage(Resource):
isLeaf = True
def render_GET(self, request):
print(request.uri)
x = (request.uri).decode('ascii')
x = x[1:]
x = todi(x)
return x.encode('ascii')
def todi(st):
if len(st) == 0:
return '{}'
if st[len(st)-1] == '/':
st = st[:-1]
if len(st) == 0:
return '()'
if st[0] == '?':
st = st[1:]
st = urllib.parse.parse_qsl(st)
return str(dict(st))
factory = Site(FormPage())
reactor.listenTCP(80, factory)
reactor.run()
我注意了接收简单文本时浏览器显示的字体。例如这个站点: http://icanhazip.com/ 当你访问时,字体看起来像 consola
字体(MS记事本的默认字体)。但是,当我访问我的网站时,我的浏览器显示的字体类似于 Times New Roman
.
此后我进行了一些调试,例如强制网站 return 一个简单的字符串,但没有什么能阻止 twisted 给我丑陋的字体。
在这里,有一个example。
另请注意,我在 Chrome 中执行了操作,您可以在其中右键单击并使用 "View page source" 按钮。相信我,我的两个例子都是根据那个简单的原始文本。
查看您的 Twisted 服务器返回的 headers 并将它们与其他网站返回的那些进行比较,后者指定 Content-Type: text/plain; charset=UTF-8
,而 Twisted 服务器未指定 Content-Type
完全没有。
当内容类型指定为 text/plain
与未指定的内容类型时,您的浏览器(我发现它与 Firefox 相同)使用不同的字体。
在 Twisted 中,您可以像这样用 request.setHeader()
设置 Content-Type
header:
def render_GET(self, request):
print(request.uri)
x = (request.uri).decode('ascii')
x = x[1:]
x = todi(x)
request.setHeader('Content-Type', 'text/plain; charset=UTF-8')
return x.encode('UTF-8')
因为这设置了 Content-Type
,所以它也可以指定字符集。 UTF-8(可能)是首选,并且响应文本的编码方式类似。