首页 > 代码库 > Basic HTTP Push Relay Protocol
Basic HTTP Push Relay Protocol
英文原方:
https://pushmodule.slact.net/protocol.html
简单的HTTP推协议
1 介绍
1.1目的
本协议的初衷是提供一种HTTP客户端透明长连接的支持,在服务端连接大部分时间都是空闲的,也不会被中继传递。
1.2 一般性的说明
略
1.3 术语
本规范使用一系列的名词来指代协议中的碰到的对象。
服务器(server)
实现本协议的HTTP服务器。
客户端(client)
一个可以向HTTP服务器发起TCP/IP连接的程序。
消息(message)
特定应用的数据,通常包含在请求或者回复的主体中。
信道(channel)
代表某个传递消息的路径资源。每个信道有单独的消息队列。
订阅者(subscriber)
一个向服务器发出HTTP请求,希望在某个信道上接受消息的客户端。
发布者(publisher)
一个向服务器发出HTTP请求,希望将其信息通过信道发送到订阅者那里。
信道标示(channel id)
可以标示信道的一串特别的字符串。
位置(location)
服务器的一个URL。
2.需求
2.1 服务器端的要求
HTTP服务器必须可以通过URL来设定发布和订阅的位置。所有发到发布位置的请求都必须被认为是发布者的请求。所有发到订阅位置的请求都被认为是订阅者 的请求。
服务器必须可以通过特定的字符来识别不同的信道。比如,可以是URL的一个参数(/foo/?id=123)或者是一个cookie。当然你也可以用其他 方法来区别信道,但是强烈不建议你这么做。
服务器必须接收发到发布位置的请求并迅速回复。当然也必须接收发到订阅位置的请求,但不必马上回复。
2.2 客户端的要求
所有客户端必须产生有效的HTTP请求。订阅客户端(比如浏览器)必须有应对Last-Modified和Etag的缓存机制。
2.3 信道标示
服务端不负责产生信道,而应由客户端来产生。
3. 服务器的操作
发布者的请求就像一个通知,通过某个信道把消息发到订阅者那里。订阅者的请求就是告知服务器客户端已经准备好接受消息了。
3.1 订阅者
服务器必须接收所有发到发布位置的的HTTP GET请求。其他方法的HTTP请求应该回应405状态(Method Not Allowed)。
订阅者的请求被认为是打算订阅消息的告知。订阅者可以请求已经存在、已经无效或者还没有有效的请求。订阅者通过If-Modified-Since和If -None-Match来区别这些消息。如果客户端没有If-Modified-Since头,则必须被认为假定他请求的是信道里最老的那条消息。每一个 200(OK)的回复消息必须包含有Last-Modified和Etag头,以便订阅者可以通过这些头来获取下一条消息。此外,200(ok)也必须包 含消息发布者的Content-Type头,除非发布者没有指定Content-Type或者服务器的配置刻意想隐藏Content-Type。
HTTP服务器一般有多种推的机制。服务器针对订阅者的请求回应的行为应该是可配置的,而且必须是以下列出的机制:
长时间轮询(Long-Polling)
针对已经存在的消息将迅速的回应;如果是还未有效的请求必须延迟直到消息变成有效。延迟的回复必须满足下面所有的条件:
+ 在消息有效时,包含消息及Content-Type的200(ok)回复必须立即发出。这个回复应该与那些马上回复的消息没有区别。
+ 如果订阅者等待的信道被删除了或者因为某种原因变得无效时,服务器端必须马上发出一个410(gone)的回复。
+ 如果另外一个订阅者的请求与该请求有冲突。服务器必须马上回应409(Conflict)。
间隔轮询(Interval-Polling)
所有的请求必须马上回应,如果还没有有效消息,服务器必须马上回应304(Not Modified)。
另外,当服务器在同一个信道上接受了超过一个订阅者时,它必须有如下行为:
广播(Broadcast)
没有另外的行为。
后进先出(Last-in, first-out)
除了最近等待的那个订阅者,给其他的订阅者回应409(Conflict)。
先进后出(First-in, last-out)
除了等待最久的那个订阅者,给其他的订阅者回应409(Conflict)。
服务器必须是可以配置这些行为的,而且默认是广播的。
3.2 发布者
服务器必须接受所有发到发布位置的有效的HTTP请求。针对发布者请求的不同服务器必须满足以下条件:
* GET 请求:如果存在该信道机就回复200(OK),否则回复404(Not Found )。
* PUT 请求:直接回复200(OK),如果该信道不存在就根据信道标示建立一个。
* DELETE 请求:如果信道存在,回复200(OK)并删除该信道。该信道的所有订阅者会收到410(Gone)的回复。如果不存在,回复404(Not Found)。
* POST请求是用来发送消息的。消息包含于请求的主体中,可以以任何一种编码通过信道发送。消息必须马上发送到那些长期等候的那些订阅者那里。另外,消息 可以保存下来,以便将来之用。最老的消息也可以被删除。对于POST请求,如果有向订阅者发出这个消息,服务器必须回应201(Created)。如果没 有,就回应202(Accepted)。Content-Type头必须跟随消息一起被转发。
消息的保存极限参数应该是可配置的。发布者的位置应该可以配置的。所有给发布者200的回复必须包含该应用的信道信息。这些信息可能包含保存的消息数量和 长期等待的订阅者数量。针对这些信息,服务器或许可以实现某种协商。