...

パッケージ textproto

import "net/textproto"
概要
目次

概要 ▾

textproto パッケージは,HTTP,NNTP,SMTP のテキストベースのリクエスト/レスポンスプロトコルを実装します。

パッケージは提供します :

エラー。 サーバーからの数値エラーレスポンスを表します。

パイプライン。 クライアントでパイプライン化されたリクエストとレスポンスを管理します。

数値レスポンスコード行, key: value ヘッダー,継続行の先頭のスペースで囲まれた行,行全体がドットで終わるテキストブロック全体を読み取る Reader 。

Writer ,ドットエンコードテキストブロックを書き込みます。

Conn ,単一ネットワーク接続で使用するための Reader, Writer ,および Pipeline の便利なパッケージ。

目次 ▾

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

func CanonicalMIMEHeaderKey(s string) string

CanonicalMIMEHeaderKey は, MIME ヘッダーキー s の正規形式を返します。 正規化は,最初の文字とハイフンに続く任意の文字を大文字に変換します。 残りは小文字に変換されます。 たとえば, "accept-encoding" の正規のキーは "Accept-Encoding" です。 MIME ヘッダーキーは ASCII のみと見なされます。 s に空白または無効なヘッダーフィールドバイトが含まれている場合は,変更なしで返されます。

func TrimBytes 1.1

func TrimBytes(b []byte) []byte

TrimBytes は先頭と末尾の ASCII スペースなしで b を返します。

func TrimString 1.1

func TrimString(s string) string

TrimString は先頭と末尾の ASCII スペースなしで s を返します。

type Conn

Conn は,テキストネットワークプロトコル接続を表します。 これは, I/O を管理するための Reader と Writer ,および接続上の平行リクエストを順序付けるための Pipeline で構成されています。 これらの埋め込み型はそれらと共にメソッドを持っています。 詳細についてはそれらの型のドキュメントを参照してください。

type Conn struct {
    Reader
    Writer
    Pipeline
    // エクスポートされていないフィールドがあります
}

func Dial

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

ダイヤルは, net.Dial を使用して特定のネットワーク上の特定のアドレスに接続してから,その接続に新しい Conn を返します。

func NewConn

func NewConn(conn io.ReadWriteCloser) *Conn

NewConn は,入出力に conn を使用して新しい 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 は, StartResponse と EndResponse で使用するためのコマンドの ID を返します。

たとえば,クライアントは,次のコマンドを使用してドット本体を返す HELP コマンドを実行します。

id , err:=c.Cmd("HELP")err!=nil の場合 {returnnil , err}

c.StartResponse(id)c.EndResponse(id) を延期する

_, _, err = c.ReadCodeLine(110) の場合。
err!=nil{returnnil , err} テキスト, err:=c.ReadDotBytes()err!=nil{returnnil , err}returnc.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 はキーと値のペアをヘッダに追加します。 key に関連付けられている既存の値に追加されます。

func (MIMEHeader) Del

func (h MIMEHeader) Del(key string)

Del は key に関連した値を削除します。

func (MIMEHeader) Get

func (h MIMEHeader) Get(key string) string

指定したキーに関連付けられている最初の値を取得します。 大文字と小文字は区別されません。 CanonicalMIMEHeaderKey は,渡されたキーを正規化するために使用されます。 キーに関連付けられている値がない場合, Get は "" を返します。 キーの複数の値にアクセスする,または非標準キーを使用するには,マップに直接アクセスします。

func (MIMEHeader) Set

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

Set は, key に関連付けられているヘッダエントリを 1 つの要素値に設定します。 key に関連付けられている既存の値を置き換えます。

type Pipeline

パイプラインは,パイプラインの順序どおりのリクエスト / レスポンスシーケンスを管理します。

Pipeline p を使用して接続上の複数のクライアントを管理するには,各クライアントで次のコマンドを実行する必要があります。

id := p.Next()	// 数を取る

p.StartRequest(id)	// 順番を待ってリクエストを送信する
«リクエストを送る »
p.EndRequest(id)	// リクエストが送信されたことを Pipeline に通知する

p.StartResponse(id)	// レスポンスを読むために順番を待つ
«レスポンスを読む »
p.EndResponse(id)	// レスポンスが読み取られたことを Pipeline に通知する

パイプラインサーバーは,同じ呼び出しを使用して,並行して計算されたレスポンスが正しい順序で書き込まれるようにすることができます。

type Pipeline struct {
    // エクスポートされていないフィールドがあります
}

func (*Pipeline) EndRequest

func (p *Pipeline) EndRequest(id uint)

EndRequest は,与えられた ID を持つリクエストが送信されたことを p に通知します (または,これがサーバーの場合は受信されます) 。

func (*Pipeline) EndResponse

func (p *Pipeline) EndResponse(id uint)

EndResponse は与えられた id を持つレスポンスが受け取られたことを p に通知します (あるいはこれがサーバーの場合は送られます) 。

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

Reader は,テキストプロトコルネットワーク接続からのリクエストまたはレスポンスを読み取るための便利なメソッドを実装します。

type Reader struct {
    R *bufio.Reader
    // エクスポートされていないフィールドがあります
}

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 は, r から読み取られたドットエンコードブロックのデコードされたテキストを使用して, Reads を満たす新しい Reader を返します。 返された 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 は 3 桁のステータスコードで,メッセージはその行の残りまで続きます。 そのような行の例は次のとおりです。

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 空白を取り除きます。 最初の行以降の行は,スペースまたはタブ文字で始まっていれば継続と見なされます。 返されたデータでは,継続行は前の行と 1 つのスペースだけで区切られています。 改行と先頭の空白は削除されます。

たとえば,次の入力を見てください。

1 行目は続き ...2 行目

最初の ReadContinuedLine の呼び出しは "Line1continue..." を返し, 2 回目の呼び出しは "Line 2" を返します。

空白だけからなる行が続くことはありません。

func (*Reader) ReadContinuedLineBytes

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

ReadContinuedLineBytes は ReadContinuedLine と似ていますが,文字列の代わりに [] バイトを返します。

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 と似ていますが,文字列の代わりに [] バイトを返します。

func (*Reader) ReadMIMEHeader

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

ReadMIMEHeader は, r から MIME 形式のヘッダを読み込みます。 ヘッダーは,空白行で終わる可能性のある連続した Key: Value 行のシーケンスです。 返されたマップ m は, CanonicalMIMEHeaderKey(key) を,入力と同じ順序で一連の値にマッピングします。

たとえば,次の入力を見てください。

マイキー : 値 1 ロングキー : さらに長い値マイキー : 値 2

その入力が与えられると, ReadMIMEHeader はマップを返します。

map[string][]string{" マイキー ": {" 値 1", " 値 2"} , " ロングキー ": {" さらに長い値 "} , }

func (*Reader) ReadResponse

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

ReadResponse は次の形式の複数行のレスポンスを読み取ります。

コードメッセージ行 1 コードメッセージ行 2... コードメッセージ行 n

code は 3 桁のステータスコードです。 最初の行はコードとハイフンで始まります。 レスポンスは,同じコードで始まりその後にスペースが続く行で終了します。 メッセージの各行は改行 (\n) で区切られています。

受け入れられている別の形式のレスポンスの詳細については, RFC 959 (https://www.ietf.org/rfc/rfc959.txt) の 36 ページを参照してください。

コードメッセージ行 1 メッセージ行 2... コードメッセージ行 n

ステータスのプレフィックスが expectCode 内の数字と一致しない場合, ReadResponse は err を&Error{code, message} に設定して戻ります。 たとえば, expectCode が 31 の場合,ステータスが [310,319] の範囲にないとエラーが返されます。

expectCode <= 0 はステータスコードのチェックを無効にします。

type Writer

Writer は,テキストプロトコルネットワーク接続にリクエストまたはレスポンスを書き込むための便利なメソッドを実装します。

type Writer struct {
    W *bufio.Writer
    // エクスポートされていないフィールドがあります
}

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 を閉じるときに最後の行を追加します。 呼び出し側は,次に w でメソッドを呼び出す前に DotWriter を閉じる必要があります。

ドットエンコードの詳細については, Reader の DotReader メソッドのドキュメントを参照してください。

func (*Writer) PrintfLine

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

PrintfLine はフォーマットされた出力に続けて \r\n を書き込みます。