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