编写icap服务器的框架

pyicap的Python项目详细描述


py icap
==


>用于编写icap服务器的python 3框架


age,运行它来安装
包:




您也可以使用pip或easy install安装:

sudo pip install py icap

什么是icap?
----

此类代理是一个icap客户端。

icap可用于检查权限、扫描病毒、放置广告或
否则修改头、内容或请求url或http请求
和/或响应。这些都可以在不修改代理服务器的
代码的情况下完成。

on的stock-basehttpserver类是这样的。

如果必须声明一个关系,
我说icap是http的兄弟,而不是它的子级。


由于这种关系,http服务器或客户端不能简单地扩展(甚至是修补)来处理icap。这就是为什么我选择
进行复制,然后完全重写basehttpserver类

它是如何工作的?
----


您可以使用一个框架,方法是从pyicap包导入数据,
扩展protocol handler类并启动服务器,将
处理程序传递给它:

`` python
!!/bin/env python
-*-编码:utf8-*


import random
import socketserver

from pyicap import*


class threadingsimpleserver(socketserver.threadingmixin,icapserver):
pass

class icaphandler(baseicaprequesthandler):

def echo_选项(self):
self.set_icap_response(200)
self.set_icap_header('methods','respmod')
self.set_icap_header('preview','0')
self.send_headers(false)

def echo_respmod(self):
self.no_adaptation_required()

port=13440


=threadingsimpleserver(('',port),icaphandler)
尝试:
,而1:
服务器.handle_request()
除了键盘中断:
打印"完成"

````

以上示例是一个重写的带有
线程的simplehttpserver示例。socketserver.threadingmixin可以与icapserver一起使用,就像您将其与simplehttpserver一起使用一样。

对于每个服务端点,都有一对方法。当前的
示例只是告诉icap客户机请求
不需要修改而什么都不做。


icap定义了三种类似于http的方法:options、reqmod和respmod。

options在任何情况下都必须处理。端点必须支持
reqmod或respmod,但不能同时支持两者。但是,这是不强制的,而且根据squid 3文档,这种重载甚至可以在squid上工作。


g报头或以其他方式损坏请求。

检查要下载的文件是否有病毒、水印图像或
音频文件、放置广告横幅或以其他方式修改内容和/或请求的报头圣

icap与http一样使用url。每个icap服务都有一个类似的url:

icap://icap.myorganization.com/place懔banners

pyicap框架将解析此url,确定要调用的icap方法(options、reqmod或respmod),并调用用户(可能)提供的处理程序方法之一。如果icap服务器找不到
处理程序方法,则返回404错误。



通过检查handler对象的特定字段,可以从icap请求中提取各种信息:

*enc_req:封装的请求行,带有3个元素的列表
*enc_req_headers:封装的请求头,列表字典
*enc_res_status:封装的响应状态
*enc_res_header s:封装的响应头
*有_body:true,如果icap请求有body
*service name:服务端点的名称
*封装的:包含"封装的:"头的内容作为dict
*ieof:true,如果read_chunk()遇到ieof块扩展
*命令:当前icap命令
*请求uri:包含icap请求的完整请求uri
*版本:当前icap请求的版本
*预览:无,或预览头中到达的整数
*允许:包含一组允许的()
*icap_response_code:如果调用了set_icap_response
,则包含响应代码。

这意味着
封装的消息不会改变。它遵循allow头,只有当客户端允许这样的响应时,
才发送204不需要自适应。
*cont():向客户端发送icap 100 continue响应。可以
用于请求客户端在预览后继续发送数据。
*read_chunk():从客户端读取块。请注意,此调用会阻塞。如果线路上没有可用数据,并且使用了连接:
保持活动,则会导致服务器挂起。只有在确定最终会有可用的数据时,才应调用此方法。如果返回空字符串,则表示它是最后一个块,不应执行进一步的读取。如果遇到ieof块扩展名,它还将
ieof变量设置为true。
如果封装的消息
完全适合预览,则在预览期间发送此扩展名。如果ieof为true,则continue()不能被
调用。
*set_icap_response(code):设置icap响应
*set_enc_status(stats):设置封装状态行
*set_enc_request(request):设置封装请求行
*set_enc_header(header,value):设置封装头r.多个
调用将导致头被多次发送。这对于cookie:headers来说很有用。
*set_icap_header(header,value):设置icap header。注意,这应该
不能正常使用,因为所有必需的icap头都由框架自动设置
(如istag、enclosed、date、
server等)
*send_头(has_body=false):可以在设置icap和
enclosed头之后使用。参数has_body表示
封装的消息体的存在。
*send_chunk(data):将块写入客户端。空块必须
作为最后一个块写入。必须在发送适当的
头之后发送数据,可以使用send_header()或enc_header()/icap_header()+
send_headers()。两种报头发送方法不能混合。
如果使用send_报头发送数据,必须将has_body参数设置为rly表示是否存在封装的
消息正文。







欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java在Hibernate中从两个具有不同功能的表(postgreSQL)映射一个实体   java jfreechart需要自定义Y轴,以便打印   Java:从外部获取类。罐子   java如何获取Appium服务器日志   具有完全相同内容的java重写函数会导致错误   java消息的类路径是什么。属性(如果在依赖项jar中)   循环/相等的java问题==   java如何使用ionic cordova angularjs将所选图像发送到spring controller以保存到服务器?   库中的java语言环境数据   java从JSON webservice检索安卓中的字节[]   调试如何从Java中的类调试方法?   java将日期字符串切割成变量   无法使用java附加到文件?