©
本文档使用
php.cn手册 发布
import "net/textproto"
概况
索引
Package textproto 以 HTTP,NNTP 和 SMTP 的风格实现对基于文本的请求/响应协议的通用支持。
该软件包提供:
Error,表示来自服务器的数字错误响应。
Pipeline,管理客户端中的流水线请求和响应。
Reader,读取数字响应代码行,键:值标题,用连续行上的前导空格包裹的行,以及单独以行结束的整个文本块。
Writer,编写点编码的文本块。
Conn,一种便于阅读器,书写器和管道的包装,可用于单一网络连接。
func CanonicalMIMEHeaderKey(s string) string
func TrimBytes(b []byte) []byte
func TrimString(s string) string
type Conn
func Dial(network, addr string) (*Conn, error)
func NewConn(conn io.ReadWriteCloser) *Conn
func (c *Conn) Close() error
func (c *Conn) Cmd(format string, args ...interface{}) (id uint, err error)
type Error
func (e *Error) Error() string
type MIMEHeader
func (h MIMEHeader) Add(key, value string)
func (h MIMEHeader) Del(key string)
func (h MIMEHeader) Get(key string) string
func (h MIMEHeader) Set(key, value string)
type Pipeline
func (p *Pipeline) EndRequest(id uint)
func (p *Pipeline) EndResponse(id uint)
func (p *Pipeline) Next() uint
func (p *Pipeline) StartRequest(id uint)
func (p *Pipeline) StartResponse(id uint)
type ProtocolError
func (p ProtocolError) Error() string
type Reader
func NewReader(r *bufio.Reader) *Reader
func (r *Reader) DotReader() io.Reader
func (r *Reader) ReadCodeLine(expectCode int) (code int, message string, err error)
func (r *Reader) ReadContinuedLine() (string, error)
func (r *Reader) ReadContinuedLineBytes() ([]byte, error)
func (r *Reader) ReadDotBytes() ([]byte, error)
func (r *Reader) ReadDotLines() ([]string, error)
func (r *Reader) ReadLine() (string, error)
func (r *Reader) ReadLineBytes() ([]byte, error)
func (r *Reader) ReadMIMEHeader() (MIMEHeader, error)
func (r *Reader) ReadResponse(expectCode int) (code int, message string, err error)
type Writer
func NewWriter(w *bufio.Writer) *Writer
func (w *Writer) DotWriter() io.WriteCloser
func (w *Writer) PrintfLine(format string, args ...interface{}) error
header.go pipeline.go reader.go textproto.go writer.go
func CanonicalMIMEHeaderKey(s string) string
CanonicalMIMEHeaderKey 返回 MIME 标头密钥的规范格式。规范化将第一个字母和连字符后面的任何字母转换为大写; 其余的都转换为小写。例如,“accept-encoding”的规范密钥是“Accept-Encoding”。假设 MIME 标题密钥仅为 ASCII 。如果 s 包含空格或无效标题字段字节,则不做任何修改就返回。
func TrimBytes(b []byte) []byte
TrimBytes 返回 b,没有前导和尾随 ASCII 空间。
func TrimString(s string) string
TrimString 返回 s,没有前导和尾随的 ASCII 空间。
Conn 表示文本网络协议连接。它由读写器组成,用于管理 I/O 和管道,以便对连接上的并发请求进行排序。这些嵌入式类型带有它们的方法; 有关详细信息,请参阅这些类型的文档。
type Conn struct { Reader Writer Pipeline // contains filtered or unexported fields}
func Dial(network, addr string) (*Conn, error)
Dial 使用 net.Dial 连接到给定网络上的给定地址,然后为连接返回一个新的 Conn 。
func NewConn(conn io.ReadWriteCloser) *Conn
NewConn 使用 conn 返回一个新的 Conn 用于 I/O 。
func (c *Conn) Close() error
Close 关闭连接。
func (c *Conn) Cmd(format string, args ...interface{}) (id uint, err error)
Cmd 是一个方便的方法,它在流水线中等待轮流后发送命令。命令文本是使用 args 格式化格式并追加 \r \n 的结果。Cmd 返回命令的 ID,用于 StartResponse 和 EndResponse 。
例如,客户端可能运行 HELP 命令,该命令使用以下命令返回点体:
id, err := c.Cmd("HELP")if err != nil {return nil, err}c.StartResponse(id)defer c.EndResponse(id)if _, _, err = c.ReadCodeLine(110); err != nil {return nil, err}text, err := c.ReadDotBytes()if err != nil {return nil, err}return c.ReadCodeLine(250)
错误表示来自服务器的数字错误响应。
type Error struct { Code int Msg string}
func (e *Error) Error() string
MIMEHeader 表示将值映射到多组值的 MIME 样式标题。
type MIMEHeader map[string][]string
func (h MIMEHeader) Add(key, value string)
添加将关键字值对添加到标题。它附加到与键相关的任何现有值。
func (h MIMEHeader) Del(key string)
Del 删除与键关联的值。
func (h MIMEHeader) Get(key string) string
获取与给定键相关的第一个值。它不区分大小写; CanonicalMIMEHeaderKey 用于规范提供的密钥。如果没有与该键关联的值,Get 返回“”。要访问密钥的多个值或使用非规范密钥,请直接访问地图。
func (h MIMEHeader) Set(key, value string)
Set 将与键关联的标题条目设置为单个元素值。它取代了任何与键相关的现有值。
管道管理流水线顺序请求/响应序列。
要使用管道 p 来管理连接上的多个客户端,每个客户端应运行:
id := p.Next()// take a numberp.StartRequest(id)// wait for turn to send request«send request» p.EndRequest(id)// notify Pipeline that request is sentp.StartResponse(id)// wait for turn to read response«read response» p.EndResponse(id)// notify Pipeline that response is read
流水线服务器可以使用相同的调用来确保并行计算的响应以正确的顺序写入。
type Pipeline struct { // contains filtered or unexported fields}
func (p *Pipeline) EndRequest(id uint)
EndRequest 通知 p 具有给定 ID 的请求已发送(或者,如果这是一个服务器,则接收)。
func (p *Pipeline) EndResponse(id uint)
EndResponse 通知 p 已收到给定 ID 的响应(或者,如果是服务器,则发送)。
func (p *Pipeline) Next() uint
接下来返回请求/响应对的下一个 ID 。
func (p *Pipeline) StartRequest(id uint)
StartRequest 阻塞,直到发送(或者,如果这是服务器,接收)具有给定 ID 的请求。
func (p *Pipeline) StartResponse(id uint)
StartResponse 块直到需要接收(或者,如果这是服务器,发送)具有给定 ID 的请求。
ProtocolError 描述协议违规,例如无效响应或挂断连接。
type ProtocolError string
func (p ProtocolError) Error() string
Reader 实现便捷方法来读取来自文本协议网络连接的请求或响应。
type Reader struct { R *bufio.Reader // contains filtered or unexported fields}
func NewReader(r *bufio.Reader) *Reader
NewReader 从 r 返回一个新的 Reader 读数。
为了避免拒绝服务攻击,提供的 bufio.Reader 应该从 io.LimitReader 或类似的 Reader 中读取以限制响应的大小。
func (r *Reader) DotReader() io.Reader
DotReader 返回一个新的 Reader,它使用从 r 读取的点编码块的解码文本满足 Reads。返回的 Reader 只有在下一次调用 r 时才有效。
点编码是用于文本协议(如 SMTP)中的数据块的常用成帧。数据由一系列行组成,每行以“\ r \ n”结尾。序列本身结束于只包含一个点的一行:“。\ r \ n”。以点开头的行会用另外一个点进行转义,以避免看起来像序列的结尾。
Reader 的 Read 方法返回的解码格式会将“\ r \ n”行尾重写为简单的“\ n”,如果存在则删除前导点转义,并在消耗(并放弃)顺序线。
func (r *Reader) ReadCodeLine(expectCode int) (code int, message string, err error)
ReadCodeLine 读取表单的响应代码行
code message
其中代码是一个三位数的状态码,并且该消息延伸到该行的其余部分。这样的一个例子是:
220 plan9.bell-labs.com ESMTP
如果状态的前缀与 expectCode 中的数字不匹配,则 ReadCodeLine 返回,并将 err 设置为 &Error {code,message } 。例如,如果 expectCode 为31,如果状态不在 310,319 范围内,则会返回错误。
如果响应是多行的,则 ReadCodeLine 返回一个错误。
expectCode <= 0将禁用状态码的检查。
func (r *Reader) ReadContinuedLine() (string, error)
ReadContinuedLine 从 r 中读取一个可能的连续行,消除最后的尾随 ASCII 空白。如果以空格或制表符开头,则第一行之后的行被认为是连续的。在返回的数据中,延续线与前一行仅由一个空格分开:删除了换行符和前导空格。
例如,考虑这个输入:
Line 1 continued...Line 2
第一次调用 ReadContinuedLine 将返回“第1行继续...”,第2次将返回“第2行”。
只有白色空间的行不会继续。
func (r *Reader) ReadContinuedLineBytes() ([]byte, error)
ReadContinuedLineBytes 类似于 ReadContinuedLine,但返回 [] 字节而不是字符串。
func (r *Reader) ReadDotBytes() ([]byte, error)
ReadDotBytes 读取点编码并返回解码后的数据。
有关点编码的详细信息,请参阅 DotReader 方法的文档。
func (r *Reader) ReadDotLines() ([]string, error)
ReadDotLines 读取一个点编码并返回一个包含解码行的片段,最后的 \ r \ n 或 \ n 将被删除。
有关点编码的详细信息,请参阅 DotReader 方法的文档。
func (r *Reader) ReadLine() (string, error)
ReadLine 从 r 读取一行,从返回的字符串中删除最后的 \ n 或 \ r \ n 。
func (r *Reader) ReadLineBytes() ([]byte, error)
ReadLineBytes 与 ReadLine 类似,但返回 []字节而不是字符串。
func (r *Reader) ReadMIMEHeader() (MIMEHeader, error)
ReadMIMEHeader 从 r 读取 MIME 风格的头文件。标题是可能继续的 Key:Value 行以空行结尾的序列。返回的映射 m 将 CanonicalMIMEHeaderKey(key)映射为输入中遇到的相同顺序的值序列。
例如,考虑这个输入:
My-Key: Value 1Long-Key: Even Longer Value My-Key: Value 2
鉴于该输入,ReadMIMEHeader 返回 map:
map[string][]string{"My-Key": {"Value 1", "Value 2"},"Long-Key": {"Even Longer Value"},}
func (r *Reader) ReadResponse(expectCode int) (code int, message string, err error)
ReadResponse 读取表单的多行响应:
code-message line 1code-message line 2...code message line n
代码是一个三位数的状态码。第一行以代码和连字符开头。响应由以相同的代码和空格开始的行结束。消息中的每一行都用换行符分隔(\ n)。
请参阅 RFC 959(http://www.ietf.org/rfc/rfc959.txt)的第36页,了解接受的另一种形式的响应的详细信息:
code-message line 1message line 2...code message line n
如果状态的前缀与 expectCode 中的数字不匹配,则 ReadResponse 返回,并将 err 设置为 &Error {code,message}。例如,如果 expectCode 为31,如果状态不在310,319范围内,则会返回错误。
expectCode <= 0 将禁用状态码的检查。
Writer 实现方便的方法来编写对文本协议网络连接的请求或响应。
type Writer struct { W *bufio.Writer // contains filtered or unexported fields}
func NewWriter(w *bufio.Writer) *Writer
NewWriter 返回一个写入 w 的新 Writer 。
func (w *Writer) DotWriter() io.WriteCloser
DotWriter 返回一个写入器,可以用来为 w 写一个点编码。它需要在需要时插入前导点,将行结束符 \ n 转换为 \ r \ n,并在 DotWriter 关闭时添加最后的 \ r \ n 行。调用者应在下一次调用 w 上的方法之前关闭 DotWriter 。
有关点编码的详细信息,请参阅 Reader 的 DotReader 方法的文档。
func (w *Writer) PrintfLine(format string, args ...interface{}) error
PrintfLine 写入格式化的输出,后面跟着 \ r \ n 。