?
このドキュメントでは、 php中國(guó)語(yǔ)ネットマニュアル リリース
import "net/textproto"
概況
索引
Package textproto 以 HTTP,NNTP 和 SMTP 的風(fēng)格實(shí)現(xiàn)對(duì)基于文本的請(qǐng)求/響應(yīng)協(xié)議的通用支持。
該軟件包提供:
Error,表示來(lái)自服務(wù)器的數(shù)字錯(cuò)誤響應(yīng)。
Pipeline,管理客戶端中的流水線請(qǐng)求和響應(yīng)。
Reader,讀取數(shù)字響應(yīng)代碼行,鍵:值標(biāo)題,用連續(xù)行上的前導(dǎo)空格包裹的行,以及單獨(dú)以行結(jié)束的整個(gè)文本塊。
Writer,編寫(xiě)點(diǎn)編碼的文本塊。
Conn,一種便于閱讀器,書(shū)寫(xiě)器和管道的包裝,可用于單一網(wǎng)絡(luò)連接。
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 標(biāo)頭密鑰的規(guī)范格式。規(guī)范化將第一個(gè)字母和連字符后面的任何字母轉(zhuǎn)換為大寫(xiě); 其余的都轉(zhuǎn)換為小寫(xiě)。例如,“accept-encoding”的規(guī)范密鑰是“Accept-Encoding”。假設(shè) MIME 標(biāo)題密鑰僅為 ASCII 。如果 s 包含空格或無(wú)效標(biāo)題字段字節(jié),則不做任何修改就返回。
func TrimBytes(b []byte) []byte
TrimBytes 返回 b,沒(méi)有前導(dǎo)和尾隨 ASCII 空間。
func TrimString(s string) string
TrimString 返回 s,沒(méi)有前導(dǎo)和尾隨的 ASCII 空間。
Conn 表示文本網(wǎng)絡(luò)協(xié)議連接。它由讀寫(xiě)器組成,用于管理 I/O 和管道,以便對(duì)連接上的并發(fā)請(qǐng)求進(jìn)行排序。這些嵌入式類型帶有它們的方法; 有關(guān)詳細(xì)信息,請(qǐng)參閱這些類型的文檔。
type Conn struct { Reader Writer Pipeline // contains filtered or unexported fields}
func Dial(network, addr string) (*Conn, error)
Dial 使用 net.Dial 連接到給定網(wǎng)絡(luò)上的給定地址,然后為連接返回一個(gè)新的 Conn 。
func NewConn(conn io.ReadWriteCloser) *Conn
NewConn 使用 conn 返回一個(gè)新的 Conn 用于 I/O 。
func (c *Conn) Close() error
Close 關(guān)閉連接。
func (c *Conn) Cmd(format string, args ...interface{}) (id uint, err error)
Cmd 是一個(gè)方便的方法,它在流水線中等待輪流后發(fā)送命令。命令文本是使用 args 格式化格式并追加 \r \n 的結(jié)果。Cmd 返回命令的 ID,用于 StartResponse 和 EndResponse 。
例如,客戶端可能運(yùn)行 HELP 命令,該命令使用以下命令返回點(diǎn)體:
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)
錯(cuò)誤表示來(lái)自服務(wù)器的數(shù)字錯(cuò)誤響應(yīng)。
type Error struct { Code int Msg string}
func (e *Error) Error() string
MIMEHeader 表示將值映射到多組值的 MIME 樣式標(biāo)題。
type MIMEHeader map[string][]string
func (h MIMEHeader) Add(key, value string)
添加將關(guān)鍵字值對(duì)添加到標(biāo)題。它附加到與鍵相關(guān)的任何現(xiàn)有值。
func (h MIMEHeader) Del(key string)
Del 刪除與鍵關(guān)聯(lián)的值。
func (h MIMEHeader) Get(key string) string
獲取與給定鍵相關(guān)的第一個(gè)值。它不區(qū)分大小寫(xiě); CanonicalMIMEHeaderKey 用于規(guī)范提供的密鑰。如果沒(méi)有與該鍵關(guān)聯(lián)的值,Get 返回“”。要訪問(wèn)密鑰的多個(gè)值或使用非規(guī)范密鑰,請(qǐng)直接訪問(wèn)地圖。
func (h MIMEHeader) Set(key, value string)
Set 將與鍵關(guān)聯(lián)的標(biāo)題條目設(shè)置為單個(gè)元素值。它取代了任何與鍵相關(guān)的現(xiàn)有值。
管道管理流水線順序請(qǐng)求/響應(yīng)序列。
要使用管道 p 來(lái)管理連接上的多個(gè)客戶端,每個(gè)客戶端應(yīng)運(yùn)行:
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
流水線服務(wù)器可以使用相同的調(diào)用來(lái)確保并行計(jì)算的響應(yīng)以正確的順序?qū)懭搿?/p>
type Pipeline struct { // contains filtered or unexported fields}
func (p *Pipeline) EndRequest(id uint)
EndRequest 通知 p 具有給定 ID 的請(qǐng)求已發(fā)送(或者,如果這是一個(gè)服務(wù)器,則接收)。
func (p *Pipeline) EndResponse(id uint)
EndResponse 通知 p 已收到給定 ID 的響應(yīng)(或者,如果是服務(wù)器,則發(fā)送)。
func (p *Pipeline) Next() uint
接下來(lái)返回請(qǐng)求/響應(yīng)對(duì)的下一個(gè) ID 。
func (p *Pipeline) StartRequest(id uint)
StartRequest 阻塞,直到發(fā)送(或者,如果這是服務(wù)器,接收)具有給定 ID 的請(qǐng)求。
func (p *Pipeline) StartResponse(id uint)
StartResponse 塊直到需要接收(或者,如果這是服務(wù)器,發(fā)送)具有給定 ID 的請(qǐng)求。
ProtocolError 描述協(xié)議違規(guī),例如無(wú)效響應(yīng)或掛斷連接。
type ProtocolError string
func (p ProtocolError) Error() string
Reader 實(shí)現(xiàn)便捷方法來(lái)讀取來(lái)自文本協(xié)議網(wǎng)絡(luò)連接的請(qǐng)求或響應(yīng)。
type Reader struct { R *bufio.Reader // contains filtered or unexported fields}
func NewReader(r *bufio.Reader) *Reader
NewReader 從 r 返回一個(gè)新的 Reader 讀數(shù)。
為了避免拒絕服務(wù)攻擊,提供的 bufio.Reader 應(yīng)該從 io.LimitReader 或類似的 Reader 中讀取以限制響應(yīng)的大小。
func (r *Reader) DotReader() io.Reader
DotReader 返回一個(gè)新的 Reader,它使用從 r 讀取的點(diǎn)編碼塊的解碼文本滿足 Reads。返回的 Reader 只有在下一次調(diào)用 r 時(shí)才有效。
點(diǎn)編碼是用于文本協(xié)議(如 SMTP)中的數(shù)據(jù)塊的常用成幀。數(shù)據(jù)由一系列行組成,每行以“\ r \ n”結(jié)尾。序列本身結(jié)束于只包含一個(gè)點(diǎn)的一行:“。\ r \ n”。以點(diǎn)開(kāi)頭的行會(huì)用另外一個(gè)點(diǎn)進(jìn)行轉(zhuǎn)義,以避免看起來(lái)像序列的結(jié)尾。
Reader 的 Read 方法返回的解碼格式會(huì)將“\ r \ n”行尾重寫(xiě)為簡(jiǎn)單的“\ n”,如果存在則刪除前導(dǎo)點(diǎn)轉(zhuǎn)義,并在消耗(并放棄)順序線。
func (r *Reader) ReadCodeLine(expectCode int) (code int, message string, err error)
ReadCodeLine 讀取表單的響應(yīng)代碼行
code message
其中代碼是一個(gè)三位數(shù)的狀態(tài)碼,并且該消息延伸到該行的其余部分。這樣的一個(gè)例子是:
220 plan9.bell-labs.com ESMTP
如果狀態(tài)的前綴與 expectCode 中的數(shù)字不匹配,則 ReadCodeLine 返回,并將 err 設(shè)置為 &Error {code,message } 。例如,如果 expectCode 為31,如果狀態(tài)不在 310,319 范圍內(nèi),則會(huì)返回錯(cuò)誤。
如果響應(yīng)是多行的,則 ReadCodeLine 返回一個(gè)錯(cuò)誤。
expectCode <= 0將禁用狀態(tài)碼的檢查。
func (r *Reader) ReadContinuedLine() (string, error)
ReadContinuedLine 從 r 中讀取一個(gè)可能的連續(xù)行,消除最后的尾隨 ASCII 空白。如果以空格或制表符開(kāi)頭,則第一行之后的行被認(rèn)為是連續(xù)的。在返回的數(shù)據(jù)中,延續(xù)線與前一行僅由一個(gè)空格分開(kāi):刪除了換行符和前導(dǎo)空格。
例如,考慮這個(gè)輸入:
Line 1 continued...Line 2
第一次調(diào)用 ReadContinuedLine 將返回“第1行繼續(xù)...”,第2次將返回“第2行”。
只有白色空間的行不會(huì)繼續(xù)。
func (r *Reader) ReadContinuedLineBytes() ([]byte, error)
ReadContinuedLineBytes 類似于 ReadContinuedLine,但返回 [] 字節(jié)而不是字符串。
func (r *Reader) ReadDotBytes() ([]byte, error)
ReadDotBytes 讀取點(diǎn)編碼并返回解碼后的數(shù)據(jù)。
有關(guān)點(diǎn)編碼的詳細(xì)信息,請(qǐng)參閱 DotReader 方法的文檔。
func (r *Reader) ReadDotLines() ([]string, error)
ReadDotLines 讀取一個(gè)點(diǎn)編碼并返回一個(gè)包含解碼行的片段,最后的 \ r \ n 或 \ n 將被刪除。
有關(guān)點(diǎn)編碼的詳細(xì)信息,請(qǐng)參閱 DotReader 方法的文檔。
func (r *Reader) ReadLine() (string, error)
ReadLine 從 r 讀取一行,從返回的字符串中刪除最后的 \ n 或 \ r \ n 。
func (r *Reader) ReadLineBytes() ([]byte, error)
ReadLineBytes 與 ReadLine 類似,但返回 []字節(jié)而不是字符串。
func (r *Reader) ReadMIMEHeader() (MIMEHeader, error)
ReadMIMEHeader 從 r 讀取 MIME 風(fēng)格的頭文件。標(biāo)題是可能繼續(xù)的 Key:Value 行以空行結(jié)尾的序列。返回的映射 m 將 CanonicalMIMEHeaderKey(key)映射為輸入中遇到的相同順序的值序列。
例如,考慮這個(gè)輸入:
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 讀取表單的多行響應(yīng):
code-message line 1code-message line 2...code message line n
代碼是一個(gè)三位數(shù)的狀態(tài)碼。第一行以代碼和連字符開(kāi)頭。響應(yīng)由以相同的代碼和空格開(kāi)始的行結(jié)束。消息中的每一行都用換行符分隔(\ n)。
請(qǐng)參閱 RFC 959(http://www.ietf.org/rfc/rfc959.txt)的第36頁(yè),了解接受的另一種形式的響應(yīng)的詳細(xì)信息:
code-message line 1message line 2...code message line n
如果狀態(tài)的前綴與 expectCode 中的數(shù)字不匹配,則 ReadResponse 返回,并將 err 設(shè)置為 &Error {code,message}。例如,如果 expectCode 為31,如果狀態(tài)不在310,319范圍內(nèi),則會(huì)返回錯(cuò)誤。
expectCode <= 0 將禁用狀態(tài)碼的檢查。
Writer 實(shí)現(xiàn)方便的方法來(lái)編寫(xiě)對(duì)文本協(xié)議網(wǎng)絡(luò)連接的請(qǐng)求或響應(yīng)。
type Writer struct { W *bufio.Writer // contains filtered or unexported fields}
func NewWriter(w *bufio.Writer) *Writer
NewWriter 返回一個(gè)寫(xiě)入 w 的新 Writer 。
func (w *Writer) DotWriter() io.WriteCloser
DotWriter 返回一個(gè)寫(xiě)入器,可以用來(lái)為 w 寫(xiě)一個(gè)點(diǎn)編碼。它需要在需要時(shí)插入前導(dǎo)點(diǎn),將行結(jié)束符 \ n 轉(zhuǎn)換為 \ r \ n,并在 DotWriter 關(guān)閉時(shí)添加最后的 \ r \ n 行。調(diào)用者應(yīng)在下一次調(diào)用 w 上的方法之前關(guān)閉 DotWriter 。
有關(guān)點(diǎn)編碼的詳細(xì)信息,請(qǐng)參閱 Reader 的 DotReader 方法的文檔。
func (w *Writer) PrintfLine(format string, args ...interface{}) error
PrintfLine 寫(xiě)入格式化的輸出,后面跟著 \ r \ n 。