Package textproto

import "net/textproto"
Overview
Index

Overview ▾

软件包textproto以HTTP,NNTP和SMTP的样式实现了对基于文本的请求/响应协议的通用支持.

该软件包提供:

错误,表示来自服务器的数字错误响应.

管道,用于管理客户端中的管道化请求和响应.

阅读器,用于读取数字响应代码行,键:值标题,在续行上用前导空格包裹的行以及整个文本块,它们本身以一行上的点结尾.

Writer,用于编写点编码的文本块.

Conn,用于单个网络连接的Reader,Writer和Pipeline的便捷包装.

Index ▾

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

Package files

header.go pipeline.go reader.go textproto.go writer.go

func CanonicalMIMEHeaderKey

func CanonicalMIMEHeaderKey(s string) string

CanonicalMIMEHeaderKey返回MIME标头密钥s的规范格式. 规范化将第一个字母和连字符后的任何字母转换为大写; 其余的将转换为小写. 例如,"接受编码"的规范密钥为"接受编码". 假定MIME标头密钥仅是ASCII. 如果s包含空格或无效的头字段字节,则返回它而无需修改.

func TrimBytes 1.1

func TrimBytes(b []byte) []byte

TrimBytes返回b,不带前导和尾随ASCII空间.

func TrimString 1.1

func TrimString(s string) string

TrimString返回s,而没有前导和尾随ASCII空间.

type Conn

Conn代表文本网络协议连接. 它由用于管理I / O的读取器和写入器以及用于对连接上的并发请求进行排序的管道组成. 这些嵌入式类型带有方法. 有关详细信息,请参见这些类型的文档.

type Conn struct {
    Reader
    Writer
    Pipeline
    // contains filtered or unexported fields
}

func Dial

func Dial(network, addr string) (*Conn, error)

Dial使用net.Dial连接到给定网络上的给定地址,然后返回一个新的Conn进行连接.

func NewConn

func NewConn(conn io.ReadWriteCloser) *Conn

NewConn使用conn进行I / O返回新的Conn.

func (*Conn) Close

func (c *Conn) Close() error

关闭关闭连接.

func (*Conn) Cmd

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

错误表示来自服务器的数字错误响应.

type Error struct {
    Code int
    Msg  string
}

func (*Error) Error

func (e *Error) Error() string

type MIMEHeader

MIMEHeader表示将MIME样式的标头映射键映射到值集.

type MIMEHeader map[string][]string

func (MIMEHeader) Add

func (h MIMEHeader) Add(key, value string)

Add将键,值对添加到标题. 它附加到与键关联的任何现有值.

func (MIMEHeader) Del

func (h MIMEHeader) Del(key string)

Del删除与键关联的值.

func (MIMEHeader) Get

func (h MIMEHeader) Get(key string) string

Get获取与给定键关联的第一个值. 不区分大小写; CanonicalMIMEHeaderKey用于规范化所提供的密钥. 如果没有与键关联的值,则Get返回"". 要访问键的多个值或使用非规范键,请直接访问地图.

func (MIMEHeader) Set

func (h MIMEHeader) Set(key, value string)

Set将与key关联的标题条目设置为单个元素值. 它替换了与键关联的任何现有值.

type Pipeline

管道管理流水线顺序的请求/响应序列.

要使用管道p管理一个连接上的多个客户端,每个客户端应运行:

id := p.Next()	// take a number

p.StartRequest(id)	// wait for turn to send request
«send request»
p.EndRequest(id)	// notify Pipeline that request is sent

p.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 (*Pipeline) EndRequest

func (p *Pipeline) EndRequest(id uint)

EndRequest通知p带有给定id的请求已发送(或者,如果是服务器,则已接收).

func (*Pipeline) EndResponse

func (p *Pipeline) EndResponse(id uint)

EndResponse通知p已收到具有给定ID的响应(或者,如果是服务器,则发送).

func (*Pipeline) Next

func (p *Pipeline) Next() uint

Next返回请求/响应对的下一个ID.

func (*Pipeline) StartRequest

func (p *Pipeline) StartRequest(id uint)

StartRequest将阻塞,直到该发送具有给定id的请求(或者,如果这是服务器,则是接收该请求).

func (*Pipeline) StartResponse

func (p *Pipeline) StartResponse(id uint)

StartResponse将阻塞,直到可以接收(或发送)具有给定ID的请求为止.

type ProtocolError

ProtocolError描述了协议冲突,例如无效响应或挂断的连接.

type ProtocolError string

func (ProtocolError) Error

func (p ProtocolError) Error() string

type Reader

读取器实现了一些便利方法,用于从文本协议网络连接读取请求或响应.

type Reader struct {
    R *bufio.Reader
    // contains filtered or unexported fields
}

func NewReader

func NewReader(r *bufio.Reader) *Reader

NewReader从r返回一个新的Reader读数.

为了避免拒绝服务攻击,提供的bufio.Reader应该从io.LimitReader或类似的Reader中读取内容,以限制响应的大小.

func (*Reader) DotReader

func (r *Reader) DotReader() io.Reader

DotReader返回一个新的Reader,该阅读器使用从r读取的点编码块的解码文本来满足Reads的要求. 返回的Reader仅在下一次调用r上的方法之前才有效.

点编码是用于文本协议(例如SMTP)中的数据块的常见帧. 数据由一系列行组成,每行以" \ r \ n"结尾. 序列本身在仅包含点的行结束:".\ r \ n". 以点开头的行将以附加点进行转义,以避免看起来像序列的结尾.

由Reader的Read方法返回的解码形式会将" \ r \ n"行结尾重写为更简单的" \ n",如果存在则删除前导点转义符,并且在消费(并丢弃)末尾后以错误io.EOF停止.有序线.

func (*Reader) ReadCodeLine

func (r *Reader) ReadCodeLine(expectCode int) (code int, message string, err error)

ReadCodeLine读取以下形式的响应代码行

code message

其中code是三位数字的状态码,消息延伸到该行的其余部分. 这样的行的示例是:

220 plan9.bell-labs.com ESMTP

如果状态的前缀与ExpectCode中的数字不匹配,则ReadCodeLine返回,且err设置为&Error {code,message}. 例如,如果ExpectCode为31,则如果状态不在[310,319]范围内,则将返回错误.

如果响应为多行,则ReadCodeLine返回错误.

ExpectCode <= 0禁用状态码检查.

func (*Reader) ReadContinuedLine

func (r *Reader) ReadContinuedLine() (string, error)

ReadContinuedLine从r读取可能连续的行,从而省略了最后的ASCII空格. 如果第一行之后的行以空格或制表符开头,则被认为是连续行. 在返回的数据中,续行与前一行仅用一个空格分隔:换行符和前导空格被删除.

例如,考虑以下输入:

Line 1
  continued...
Line 2

对ReadContinuedLine的第一个调用将返回"第1行继续...",第二个调用将返回"第2行".

仅包含空白的行永远不会继续.

func (*Reader) ReadContinuedLineBytes

func (r *Reader) ReadContinuedLineBytes() ([]byte, error)

ReadContinuedLineBytes类似于ReadContinuedLine,但是返回[] byte而不是字符串.

func (*Reader) ReadDotBytes

func (r *Reader) ReadDotBytes() ([]byte, error)

ReadDotBytes读取点编码并返回解码的数据.

有关点编码的详细信息,请参见DotReader方法的文档.

func (*Reader) ReadDotLines

func (r *Reader) ReadDotLines() ([]string, error)

ReadDotLines读取点编码并返回包含已解码行的切片,每行都省略最后的\ r \ n或\ n.

有关点编码的详细信息,请参见DotReader方法的文档.

func (*Reader) ReadLine

func (r *Reader) ReadLine() (string, error)

ReadLine从r读取一行,从返回的字符串中删除最后的\ n或\ r \ n.

func (*Reader) ReadLineBytes

func (r *Reader) ReadLineBytes() ([]byte, error)

ReadLineBytes类似于ReadLine,但返回[] byte而不是字符串.

func (*Reader) ReadMIMEHeader

func (r *Reader) ReadMIMEHeader() (MIMEHeader, error)

ReadMIMEHeader从r读取MIME样式的标头. 标头是可能连续的键:值行以空白行结尾的序列. 返回的映射m按照输入中遇到的相同顺序将CanonicalMIMEHeaderKey(key)映射到值序列.

例如,考虑以下输入:

My-Key: Value 1
Long-Key: Even
       Longer Value
My-Key: Value 2

给定该输入,ReadMIMEHeader返回该映射:

map[string][]string{
	"My-Key": {"Value 1", "Value 2"},
	"Long-Key": {"Even Longer Value"},
}

func (*Reader) ReadResponse

func (r *Reader) ReadResponse(expectCode int) (code int, message string, err error)

ReadResponse读取以下形式的多行响应:

code-message line 1
code-message line 2
...
code message line n

其中code是三位数的状态代码. 第一行以代码和连字符开头. 响应由以相同代码开头的行终止,后跟一个空格. 消息中的每一行都由换行符(\ n)分隔.

请参阅RFC 959( https://www.ietf.org/rfc/rfc959.txt )的第36页,了解接受的另一种形式的响应:

code-message line 1
message line 2
...
code message line n

If the prefix of the status does not match the digits in expectCode, ReadResponse returns with err set to &Error{code, message}. For example, if expectCode is 31, an error will be returned if the status is not in the range [310,319].

ExpectCode <= 0禁用状态码检查.

type Writer

编写器实现了用于将请求或响应写入文本协议网络连接的便捷方法.

type Writer struct {
    W *bufio.Writer
    // contains filtered or unexported fields
}

func NewWriter

func NewWriter(w *bufio.Writer) *Writer

NewWriter返回写入w的新Writer.

func (*Writer) DotWriter

func (w *Writer) DotWriter() io.WriteCloser

DotWriter返回一个写程序,该写程序可用于将点编码写入w. 它负责在必要时插入前导点,将行尾\ n转换为\ r \ n,并在关闭DotWriter时添加最后的.\ r \ n行. 在下一次调用w上的方法之前,调用者应关闭DotWriter.

有关点编码的详细信息,请参见Reader的DotReader方法的文档.

func (*Writer) PrintfLine

func (w *Writer) PrintfLine(format string, args ...interface{}) error

PrintfLine写入格式化输出,后跟\ r \ n.

by  ICOPY.SITE