import "http"

httpパッケージは、HTTPリクエスト、レスポンス、およびURLの解析を実装しており、拡張可能なHTTPサーバと基本的なHTTPクライアントを提供します。

パッケージファイル

chunked.go client.go dump.go fs.go lex.go persist.go request.go response.go server.go status.go transfer.go url.go

定数

RFC 2616で定義されているHTTPステータスコード。

const (
    StatusContinue           = 100
    StatusSwitchingProtocols = 101

    StatusOK                   = 200
    StatusCreated              = 201
    StatusAccepted             = 202
    StatusNonAuthoritativeInfo = 203
    StatusNoContent            = 204
    StatusResetContent         = 205
    StatusPartialContent       = 206

    StatusMultipleChoices   = 300
    StatusMovedPermanently  = 301
    StatusFound             = 302
    StatusSeeOther          = 303
    StatusNotModified       = 304
    StatusUseProxy          = 305
    StatusTemporaryRedirect = 307

    StatusBadRequest                   = 400
    StatusUnauthorized                 = 401
    StatusPaymentRequired              = 402
    StatusForbidden                    = 403
    StatusNotFound                     = 404
    StatusMethodNotAllowed             = 405
    StatusNotAcceptable                = 406
    StatusProxyAuthRequired            = 407
    StatusRequestTimeout               = 408
    StatusConflict                     = 409
    StatusGone                         = 410
    StatusLengthRequired               = 411
    StatusPreconditionFailed           = 412
    StatusRequestEntityTooLarge        = 413
    StatusRequestURITooLong            = 414
    StatusUnsupportedMediaType         = 415
    StatusRequestedRangeNotSatisfiable = 416
    StatusExpectationFailed            = 417

    StatusInternalServerError     = 500
    StatusNotImplemented          = 501
    StatusBadGateway              = 502
    StatusServiceUnavailable      = 503
    StatusGatewayTimeout          = 504
    StatusHTTPVersionNotSupported = 505
)

TimeFormatは、HTTPヘッダの解析、または時刻を生成する際にtime.Parse、およびtime.Timeで使用する時間のフォーマットです。これはtime.RFC1123と似ていますが、タイムゾーンはGMTとしてハードコーディングされています。

const TimeFormat = "Mon, 02 Jan 2006 15:04:05 GMT"

変数

var (
    ErrLineTooLong          = &ProtocolError{"header line too long"}
    ErrHeaderTooLong        = &ProtocolError{"header too long"}
    ErrShortBody            = &ProtocolError{"entity body too short"}
    ErrNotSupported         = &ProtocolError{"feature not supported"}
    ErrUnexpectedTrailer    = &ProtocolError{"trailer header without chunked transfer encoding"}
    ErrMissingContentLength = &ProtocolError{"missing ContentLength in HEAD response"}
    ErrNotMultipart         = &ProtocolError{"request Content-Type isn't multipart/form-data"}
    ErrMissingBoundary      = &ProtocolError{"no multipart boundary param Content-Type"}
)

HTTPサーバが吐き出すエラー。

var (
    ErrWriteAfterFlush = os.NewError("Conn.Write called after Flush")
    ErrBodyNotAllowed  = os.NewError("http: response status code does not allow body")
    ErrHijacked        = os.NewError("Conn has been hijacked")
)

DefaultServeMuxは、Serveで使用されるデフォルトのServeMuxです。

var DefaultServeMux = NewServeMux()
var ErrPersistEOF = &ProtocolError{"persistent connection closed"}

CanonicalHeaderKey関数

func CanonicalHeaderKey(s string) string

CanonicalHeaderKeyは、HTTPヘッダのキーsのフォーマットを正規化して返します。この正規化処理は、先頭およびハイフン直後の文字を大文字へ変換し、それ以外を小文字に変換します。たとえば、キー「accept-encoding」を正規化したものは「Accept-Encoding」になります。

CanonicalPath関数

func CanonicalPath(path string) string

CanonicalPathは、RFC 2396で規定されたアルゴリズムを適用し、パス内の不要な「.」や「..」を削除してパスを簡潔にします。

DumpRequest関数

func DumpRequest(req *Request, body bool) (dump []byte, err os.Error)

DumpRequestはデバッグ用として、リクエストを通信フォーマットに変換して返します。(オプションでリクエストのボディ部も含める) DumpRequestは見かけ上は何も行わないように見えますが、ボディ部のダンプには最適であるとともに、この関数はボディ部のデータをメモリに展開するため、以降のreq.Bodyの参照はそのメモリを参照するようになります。

DumpResponse関数

func DumpResponse(resp *Response, body bool) (dump []byte, err os.Error)

DumpResponseは、DumpRequestとほぼ同じですが、レスポンスをダンプします。

EncodeQuery関数

func EncodeQuery(m map[string][]string) string

EncodeQueryは、クエリのマルチマップで表されるクエリをエンコードします。

Error関数

func Error(w ResponseWriter, error string, code int)

Errorは、リクエストに対して指定されたエラーメッセージとHTTPコードを返します。

EscapeUserinfo関数

func EscapeUserinfo(user, password string) string

EscapeUserinfoは、userとpasswordを「user:password」形式(もしくはpasswordなしでuserのみ)に組み合わせた後、URL.RawUserinfoフィールドで使用するためにエスケープします。

この機能は、レガシーなウェブサイトでのみ使われるべきです。RFC 2396では、このようにUserinfoを解釈することについて、次のように警告しています。「推奨しません。このようにクリアテキスト(例えばURI)で認証情報を受け渡しすることは、ほとんどのケースにおいて、セキュリティリスクとなることが証明されているためです。」

Handle関数

func Handle(pattern string, handler Handler)

Handleは、DefaultServeMuxのpatternに対しhandlerを登録します。

HandleFunc関数

func HandleFunc(pattern string, handler func(ResponseWriter, *Request))

HandleFuncは、DefaultServeMuxのpatternに対しhandler関数を登録します。

ListenAndServe関数

func ListenAndServe(addr string, handler Handler) os.Error

ListenAndServeは、TCPネットワークアドレスaddrでリッスンし、接続してきた相手からのリクエストをハンドリングするためにhandlerをパラメータにServe関数を呼び出します。handlerは通常nilであり、このときはDefaultServeMuxが使われます。

下は、簡単なサーバの例です。

package main

import (
	"http"
	"io"
	"log"
)

// hello worldサーバ
func HelloServer(w http.ResponseWriter, req *http.Request) {
	io.WriteString(w, "hello, world!\n")
}

func main() {
	http.HandleFunc("/hello", HelloServer)
	err := http.ListenAndServe(":12345", nil)
	if err != nil {
		log.Exit("ListenAndServe: ", err.String())
	}
}

ListenAndServeTLS関数

func ListenAndServeTLS(addr string, certFile string, keyFile string, handler Handler) os.Error

ListenAndServeTLSは、HTTPS接続を期待する以外は、ListenAndServeと同じ動きをします。また、証明書を含むファイルと、サーバの秘密鍵と一致するファイルを与えなければなりません。

下は、簡単なサーバの例です。

import (
	"http"
	"log"
)

func handler(w http.ResponseWriter, req *http.Request) {
	w.SetHeader("Content-Type", "text/plain")
	w.Write([]byte("This is an example server.\n"))
}

func main() {
	http.HandleFunc("/", handler)
	log.Printf("About to listen on 10443. Go to https://127.0.0.1:10443/")
	err := http.ListenAndServeTLS(":10443", "cert.pem", "key.pem", nil)
	if err != nil {
		log.Exit(err)
	}
}

cert.pemとkey.pemを生成するために、crypto/tlsのgenerate_cert.goを利用可能です。

NewChunkedWriter関数

func NewChunkedWriter(w io.Writer) io.WriteCloser

NewChunkedWriterは、wに書き込む直前にHTTP”chunked”フォーマットへ変換を行う新しいWriterを返します。返されたWriterをクローズすると、ストリームが終わる印として最後に長さ0のチャンクを送信します。

NotFound関数

func NotFound(w ResponseWriter, r *Request)

NotFoundは、リクエストに対してHTTP 404 not foundエラーを返します。

ParseQuery関数

func ParseQuery(query string) (m map[string][]string, err os.Error)

ParseQueryは、URLエンコードされたクエリ文字列を解析し、キーによって関連づけられた値を格納したマップを返します。ParseQueryは常に、クエリパラメータ内の有効な値をすべて格納した、非nilであるマップを返します。エラー時、errには最初に発生したデコードエラーが格納されます。

Redirect関数

func Redirect(w ResponseWriter, r *Request, url string, code int)

Redirectは、リクエストに対してurlへのリダイレクトを返します。このurlはリクエストされたパスからの相対パスです。

Serve関数

func Serve(l net.Listener, handler Handler) os.Error

Serveは、リスナーl上のHTTP接続を受け付けると、それぞれに新しいサービススレッドを作成します。このサービススレッドはリクエストを読み込み、それに応答するためにhandlerを呼び出します。handlerは通常nilであり、このときはDefaultServeMuxが使われます。

ServeFile関数

func ServeFile(w ResponseWriter, r *Request, name string)

ServeFileは、指定されたファイルまたはディレクトリを使ってリクエストに応答します。

StatusText関数

func StatusText(code int) string

StatusTextは、HTTPステータスコードのテキストを返します。不明なコードのときは、空文字列を返します。

URLEscape関数

func URLEscape(s string) string

URLEscapeは、文字列を「URLエンコード」形式に変換します。この名前の一部には「URL」と付いていますが、このエンコードは、URL内のクエリ部分の各個要素にだけ適用されます。

URLUnescape関数

func URLUnescape(s string) (string, os.Error)

URLUnescapeは、「URLエンコード」された文字列をデコードします。%ABは0xABバイトへ、’+'は’ ‘(スペース)へ変換されます。%のあとに2桁の16進数文字列がないときはエラーを返します。この名前の一部には「URL」と付いていますが、このエンコードは、URL内のクエリ部分の各個要素にだけ適用されます。

UnescapeUserinfo関数

func UnescapeUserinfo(rawUserinfo string) (user, password string, err os.Error)

UnescapeUserinfoは、URLのRawUserinfoフィールドを、「user」または「user:password」形式として解析し、得られた2つの要素を返します。

この機能は、レガシーなウェブサイトでのみ使われるべきです。RFC 2396では、このようにUserinfoを解釈することについて、次のように警告しています。「推奨しません。このようにクリアテキスト(例えば、URI)で認証情報を受け渡しすることは、ほとんどのケースにおいて、セキュリティリスクとなることが証明されているためです。」

ClientConn型

ClientConnは、ラッピングしている接続上でHTTPキープアライブ手順を行いながら、リクエストの送信とヘッダの受信を行います。ClientConnはラッピングしている接続のクローズは行いません。利用者はCloseを呼び出し、そのラッピングしている接続の制御権を取り戻したあと、接続をクローズしなければなりません。

type ClientConn struct {
    // contains unexported fields
}

NewClientConn関数

func NewClientConn(c net.Conn, r *bufio.Reader) *ClientConn

NewClientConnは、cを読み書きする新しいClientConnを返します。rがnilでないときは、cの読み込みバッファとして使用されます。

(*ClientConn) Close関数

func (cc *ClientConn) Close() (c net.Conn, r *bufio.Reader)

Closeは、ClientConnをデタッチし、ラッピングしている接続と、読み込みバッファ(データが残されている可能性がある)を返します。Closeは、キープアライブ手順の終了が通知される前であっても呼び出すことができますが、読み書きの最中にCloseを呼び出してはいけません。

(*ClientConn) Pending関数

func (cc *ClientConn) Pending() int

Pendingは、接続に送信したリクエストのうち、レスポンスが返って来ていない数を返します。

(*ClientConn) Read関数

func (cc *ClientConn) Read() (resp *Response, err os.Error)

Readは、通信から次のレスポンスを読み込みます。有効なレスポンスがErrPersistEOFとともに返されることがありますが、これはリモート側がこの応答を最後にサービスを終えることを意味します。ReadはWriteと並列に呼び出すことができますが、Readと他のReadを同時に呼び出すことはできません。

(*ClientConn) Write関数

func (cc *ClientConn) Write(req *Request) os.Error

Writeは、リクエストを書きこみます。ErrPersistEOFが返されたときは、HTTPキープアライブにおいて接続がクローズされていることを意味します。req.Closeがtrueのときは、このリクエスト後にキープアライブ接続が論理的にクローズされ相手側のサーバに通知します。ErrUnexpectedEOFは、ラップしているTCP接続がリモート側で閉じられたことを示します。これは通常、正しい終了手順です。WriteはReadと並列に呼び出すことができますが、Writeと他のWriteを同時に呼び出すことはできません。

Handler型

Handlerインタフェースを実装したオブジェクトは、HTTPサーバ内の固有のパスまたはサブツリーに対して、サービスを登録することができます。

ServeHTTP関数は、応答ヘッダと応答データをResponseWriterに書き込んだあとでリータンしなくてはなりません。関数からのリターンによってHTTPサーバは、このリクエストが完了したことを検知し、同じ接続の次のリクエストの処理を開始します。

type Handler interface {
    ServeHTTP(ResponseWriter, *Request)
}

FileServer関数

func FileServer(root, prefix string) Handler

FileServerは、HTTPリクエストに対し、rootを起点とするファイルシステムの内容を返すハンドラを返します。このハンドラはファイルシステム上からファイル名を検索する直前に、要求されたパスからprefixを除去します。

NotFoundHandler関数

func NotFoundHandler() Handler

NotFoundHandlerは、各リクエストに対して“404 page not found”を返すだけの単純なリクエストハンドラを返します。

RedirectHandler関数

func RedirectHandler(url string, code int) Handler

RedirectHandlerは、各リクエストに対して与えられたurlとステータスコードでリダイレクトを行うリクエストハンドラを返します。

HandlerFunc型

HandlerFunc型は、普通の関数をHTTPハンドラとして使用できるようにするためのアダプタです。fが適切なシグネチャを持つ関数であれば、HandlerFunc(f)はfを呼び出すHandlerオブジェクトになります。

type HandlerFunc func(ResponseWriter, *Request)

(HandlerFunc) ServeHTTP

func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request)

ServeHTTPは、f(w, req)を呼び出します。

ProtocolError型

HTTPリクエストの解析エラー。

type ProtocolError struct {
    os.ErrorString
}

Request型

Requestは、解析済みのHTTPリクエストヘッダを表します。

type Request struct {
    Method     string // GET, POST, PUTなど。
    RawURL     string // リクエストで使われた生のURL。
    URL        *URL   // 解析済みURL。
    Proto      string // "HTTP/1.0"
    ProtoMajor int    // 1
    ProtoMinor int    // 0

    // Headerは、リクエストの行を値にマップします。
    // ヘッダが次のとき、
    //
    //	accept-encoding: gzip, deflate
    //	Accept-Language: en-us
    //	Connection: keep-alive
    //
    // これらは、次のようにマップされます。
    //
    //	Header = map[string]string{
    //		"Accept-Encoding": "gzip, deflate",
    //		"Accept-Language": "en-us",
    //		"Connection": "keep-alive",
    //	}
    //
    // HTTPでは、ヘッダ名の大文字と小文字を区別しないと定めています。
    // リクエストのパーサーは、名前の最初の文字と、ハイフンの後ろの文
    // 字を大文字にし、残りを小文字にする正規化によって、この仕様を満
    // たしています。
    Header map[string]string

    // メッセージのボディです。
    Body io.ReadCloser

    // ContentLengthには、関連するコンテントの長さを記録します。値が-1のときは、
    // 長さが不明であることを示しています。値が0以上のときは、RequestMethodが
    // "HEAD"でない限り、ボディからそのバイト数、読み出せることを示しています。
    ContentLength int64

    // 最も外部から最も内側への転送に使われたエンコーディングのリストです。
    // 空のリストは、"identity"エンコーディングを意味します。
    TransferEncoding []string

    // このリクエストに応答後、この接続を閉じるかどうか
    Close bool

    // URLによって要求されたホスト。
    // RFC 2616によって示されるように、これは、「Host:」ヘッダ、
    // もしくはURLで指定されたホスト名のどちらかです。
    Host string

    // 参照元URL。リクエストで送られてきたときのみ
    //
    // Refererは、リクエスト内のRefererと同様に綴りが間違って
    // おり、この誤りは、HTTPの黎明期からのものです。この値も
    // Headerマップから、Header["Referer"]として取り出せますが、
    // これを構造体のフィールドとして使えるようにした利点は、
    // コンパイラが、英語としては正しい綴りであるreq.Referrerを
    // 使おうとしたプログラムを検出できることです。
    // Header["Referrer"]を使っているプログラムは、コンパイラで
    // は検出できません。
    Referer string

    // 「User-Agent:」ヘッダの文字列。リクエストで送られてきたときのみ
    UserAgent string

    // 解析済みフォーム。ParseFormが呼び出されたあとでのみ有効。
    Form map[string][]string

    // Trailerは、トレーラーのキーを値にマップします。Header同様に、
    // トレーラーが、同一のキーを持つ複数のトレーラー行を持つときは、
    // それらはコンマ区切りで連結されます。
    Trailer map[string]string
}

ReadRequest関数

func ReadRequest(b *bufio.Reader) (req *Request, err os.Error)

ReadRequestは、bからリクエストを読み込み解析します。

(*Request) FormValue関数

func (r *Request) FormValue(key string) string

FormValueは、クエリの構成要素内から指定した名前を持つ最初の値を返します。FormValueは必要に応じてParseFormを呼び出します。

(*Request) MultipartReader関数

func (r *Request) MultipartReader() (multipart.Reader, os.Error)

MultipartReaderは、これがmultipart/form-dataのPOSTリクエストのとき、MIMEマルチパートのリーダを返します。 それ以外はnilとエラーを返します。

(*Request) ParseForm関数

func (r *Request) ParseForm() (err os.Error)

ParseFormは、POSTのときはリクエストのボディをフォームとして解析し、GETのときは受け取ったクエリを解析します。この関数は冪等であり、何回呼び出しても問題ありません。

(*Request) ProtoAtLeast関数

func (r *Request) ProtoAtLeast(major, minor int) bool

ProtoAtLeastは、HTTPプロトコルにmajor.minor以上のバージョンが使用されているかを返します。

(*Request) Write関数

func (req *Request) Write(w io.Writer) os.Error

Writeは、HTTP/1.1リクエスト(ヘッダとボディ)を通信フォーマットで書きこみます。このメソッドはreq内の以下のフィールドを参照します。

Host
RawURL (空のときは、URL)
Method (デフォルトは、"GET")
UserAgent (デフォルトは、defaultUserAgent)
Referer
Header
Body

Bodyに値が設定されているときは、ヘッダで”Transfer-Encoding: chunked”が強制されたのち、ボディ部を送信してクローズします。

Response型

Responseは、HTTPリクエストに対するレスポンスを表します。

type Response struct {
    Status     string // 例: "200 OK"
    StatusCode int    // 例: 200
    Proto      string // 例: "HTTP/1.0"
    ProtoMajor int    // 例: 1
    ProtoMinor int    // 例: 0

    // RequestMethodには、HTTPリクエストで使用されたメソッドを記録します。
    // Content-Lengthといったヘッダフィールドは、メソッドごとに規定されています。
    RequestMethod string // e.g. "HEAD", "CONNECT", "GET", etc.

    // Headerは、ヘッダのキーを値にマップします。レスポンスが、同一の
    // キーを持つ複数のヘッダを持つときは、それらはコンマ区切りで連結さ
    // れます。(RFC 2616のセクション4.2では、複数のヘッダと、コンマ区
    // 切りで並べられたものとを同様に扱うよう義務付けています。)値のうち、
    // この構造体の他のフィールド(例:ContentLength)に設定された値は、
    // Headerから省かれます。
    //
    // map内のキーは、正規化済みです。(CanonicalHeaderKeyを参照)
    Header map[string]string

    // Bodyは、レスポンスボディを表現します。
    Body io.ReadCloser

    // ContentLengthには、関連するコンテントの長さを記録します。
    // 値が-1のときは、長さが不明であることを示しています。値が0
    // 以上のときは、RequestMethodが"HEAD"でない限り、ボディから
    // そのバイト数、読み出せることを示しています。
    ContentLength int64

    // 最も外部から最も内側への転送に使われたエンコーディングを格納します。
    // 値がnilのときは、"identity"エンコーディングが使われたことを意味します。
    TransferEncoding []string

    // Closeには、ボディを読み込んだ後に、この接続を閉じるようヘッダで指示されて
    // いるかどうかが記録されます。この値は、クライアントへのアドバイス用であり、
    // ReadResponseもResponse.Writeも、決して接続を閉じることはありません。
    Close bool

    // Trailerは、トレーラーのキーを値にマップします。Header同様に、
    // トレーラーが、同一のキーを持つ複数のトレーラー行を持つときは、
    // それらはコンマ区切りで連結されます。
    Trailer map[string]string
}

Get関数

func Get(url string) (r *Response, finalURL string, err os.Error)

Getは、指定したURLへGETを発行します。レスポンスコードが下のリダイレクトコードのうちのいずれかのときは、最大10件までリダイレクトします。

301 (Moved Permanently)
302 (Found)
303 (See Other)
307 (Temporary Redirect)

finalURLは、取得したレスポンスのURLです。これはリダイレクトされていなければ与えたURLと同一です。

呼び出し側は、読み込みを終えたときにr.Bodyをクローズしなければなりません。

Head関数

func Head(url string) (r *Response, err os.Error)

Headは、指定したURLに対してHEADを発行します。

Post関数

func Post(url string, bodyType string, body io.Reader) (r *Response, err os.Error)

指定したURLへPOSTを発行します。

呼び出し側は、読み込みを終えたときにr.Bodyをクローズしなければなりません。

PostForm関数

func PostForm(url string, data map[string]string) (r *Response, err os.Error)

PostFormは、指定されたURLに対し、リクエストボディとしてdata内のキーとURLエンコードした値を使い、POSTを発行します。

呼び出し側では、rを読み終えたときにcloseしてください。

ReadResponse関数

func ReadResponse(r *bufio.Reader, requestMethod string) (resp *Response, err os.Error)

ReadResponseは、rからHTTPレスポンスを読み込んで返します。RequestMethodパラメータには、リクエストで使ったのと同じメソッド(例:”GET”、”HEAD”)を指定します。呼び出し側はresp.Bodyの読み込みを終えたときにresp.Body.Closeを呼び出さなければなりません。そのあと呼び出し側は、レスポンスのトレーラ部に含まれるキー/値のペアを得るためにresp.Trailerを参照することができます。

(*Response) AddHeader関数

func (r *Response) AddHeader(key, value string)

AddHeaderは、キーに対応する値を追加します。キーの大文字小文字は区別しません。

(*Response) GetHeader関数

func (r *Response) GetHeader(key string) (value string)

GetHeaderは、レスポンスヘッダ内のキーに対応する値を返します。ヘッダに同じキーが複数設定されているときは、カンマ区切りで結合した値が返されます。ヘッダ内に該当するキーがないときは空文字列を返します。キーの大文字小文字は区別しません。

(*Response) ProtoAtLeast関数

func (r *Response) ProtoAtLeast(major, minor int) bool

ProtoAtLeastは、レスポンスに使用されているHTTPプロトコルにmajor.minor以上のバージョンが使用されているかを返します。

(*Response) Write関数

func (resp *Response) Write(w io.Writer) os.Error

レスポンス(ヘッダ、ボディ、トレーラ)を通信フォーマットで書きこみます。このメソッドはresp内の以下のフィールドを使用します。

StatusCode
ProtoMajor
ProtoMinor
RequestMethod
TransferEncoding
Trailer
Body
ContentLength
Header (正規化されていないキーを持つ値は、予期しない振舞いをする原因となります)

ResponseWriter型

ResponseWriterインタフェースは、HTTPレスポンスを組み立てる際にHTTPハンドラで使用されます。

type ResponseWriter interface {
    // RemoteAddrは、カレントのリクエストを送信してきたクライアントのアドレスを返します。
    RemoteAddr() string

    // UsingTLSは、クライアントがTLSを使用して接続しているときtrueを返します。
    UsingTLS() bool

    // SetHeaderは、作成されるレスポンス内にヘッダ行をセットします。
    // 例として、 SetHeader("Content-Type", "text/html; charset=utf-8")
    // は、送信されるヘッダ行に次のように出力されます。
    //
    //	Content-Type: text/html; charset=utf-8
    //
    // このライブラリでは、Content-Typeのデフォルトは、UTF-8エンコードされたHTML
    // であるため、ユーザはこの呼び出しを個別に行う必要はありません。
    // WriteHeader (または、Write)のあとにSetHeaderを呼び出しても
    // 無視されます。
    SetHeader(string, string)

    // Writeは、HTTPの応答の一部として、接続に対してデータを書き込みます。
    // WriteHeaderがまだ呼び出されていないとき、Writeは、データを書き込む前に、
    // WriteHeader(http.StatusOK)を呼び出します。
    Write([]byte) (int, os.Error)

    // WriteHeaderは、ステータスコードとともにHTTPレスポンスヘッダを送信します。
    // WriteHeaderが明示的に呼び出されないと、Writeを最初によびだしたときに
    // 暗黙的にWriteHeader(http.StatusOK)が呼び出されるトリガーとなります。
    // そのため、明示的にWriteHeaderを呼び出すのは、主に、エラーコードを
    // 送信するときです。
    WriteHeader(int)

    // Flushは、バッファリングされているデータをクライアントに送信します。
    Flush()

    // Hijackは、この関数を呼び出した側に通信接続を
    // 引き継ぎます。Hijack()を呼び出したあとは、
    // HTTPサーバライブラリは、この接続に対し何も行わ
    // なくなるため、この接続の管理およびクローズは
    // 呼び出し側の責任となります。
    Hijack() (io.ReadWriteCloser, *bufio.ReadWriter, os.Error)
}

ServeMux型

ServeMuxは、HTTPリクエストのマルチプレクサです。これは登録されているパターンのリストと各リクエストのURLを比較し、URLと最も一致するパターンに登録されているハンドラを呼び出します。

固定パスのパターン例としては”/favicon.ico”、サブツリーのパターン例は”/images/”(最後のスラッシュに注意)です。このようにパターンは/で始まる必要があります。また長いパターンは短いパターンより優先されます。そのため”/images/”と”/images/thumbnails/”として登録されたハンドラがあるとき、”/images/thumbnails/”で始まるパスでは後者のハンドラが呼び出され、それ以外の”/images/”サブツリーへのパスでは前者が呼び出されます。

将来、パターン構文はパターンの先頭にオプションとしてホスト名を許すことになるかもしれません。そうなったときは、http://www.google.com/への全リクエストを処理するのではなく、ひとつのハンドラを”/codesearch”と”codesearch.google.com/”の2パターンとして登録するようになります。

ServeMuxもまた、リダイレクトされるリクエストのURLパスに含まれる.や..要素を、これらを含まず等価のURLへサニタイジングするようにしています。

type ServeMux struct {
    // contains unexported fields
}

NewServeMux関数

func NewServeMux() *ServeMux

NewServeMuxは、新しいServeMuxを割り当てて返します。

(*ServeMux) Handle関数

func (mux *ServeMux) Handle(pattern string, handler Handler)

Handleは、指定したパターンにハンドラを登録します。

(*ServeMux) HandleFunc関数

func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request))

HandleFuncは、指定したパターンにハンドラ関数を登録します。

(*ServeMux) ServeHTTP関数

func (mux *ServeMux) ServeHTTP(w ResponseWriter, r *Request)

ServeHTTPは、リクエストされたURLに最も一致するパターンのハンドラへ、リクエストをデスパッチします。

ServerConn型

ServerConnは、ラッピングしている接続上でHTTPキープアライブ手順が完了するまで、リクエストを読み込み、レスポンスを送信し続けます。ServerConnは、ラッピングしている接続をクローズしません。その代わりに、ユーザはCloseを呼び出して接続の制御権を取り戻します。ServerConnは、パイプラインをサポートしており、たとえばリクエストはレスポンスを送信しながら、同期読み出し(順番は保たれる)が可能です。

type ServerConn struct {
    // contains unexported fields
}

NewServerConn関数

func NewServerConn(c net.Conn, r *bufio.Reader) *ServerConn

NewServerConnは、cを読み書きする新しいServerConnを返します。rがnilでないときは、cの読み込みバッファとして使用されます。

(*ServerConn) Close関数

func (sc *ServerConn) Close() (c net.Conn, r *bufio.Reader)

Closeは、ServerConnをデタッチし、ラッピングしている接続と、読み込みバッファ(データが残されている可能性がある)を返します。 Closeは、キープアライブ手順の終了が通知される前であっても呼び出すことができますが、読み書きの最中にCloseを呼び出してはいけません。

(*ServerConn) Pending関数

func (sc *ServerConn) Pending() int

Pendingは、接続から受信したリクエストのうち、レスポンスを返していない数を返します。

(*ServerConn) Read関数

func (sc *ServerConn) Read() (req *Request, err os.Error)

Readは、通信から次のリクエストを読み込みます。これ以上リクエストが続かないことが決定されているときはErrPersistEOFが返されます。(例:HTTP/1.0接続の最初のリクエスト、またはHTTP/1.1接続のConnection:close後) ReadはWriteと並列に呼び出すことができますが、Readと他のReadを同時に呼び出すことはできません。

(*ServerConn) Write関数

func (sc *ServerConn) Write(resp *Response) os.Error

Writeは、レスポンスを書きこみます。接続をクローズしたいときはResponse.Closeをtrueをセットしてください。Writeは、Read側で返されるどんなエラーに関係なくWriteエラーを返すまで使用可能であるとみなされます。WriteはReadと並列に呼び出すことができますが、Writeと他のWriteを同時に呼び出すことはできません。

URL型

URLは、解析済みのURL(厳密にはURI参照)を表します。この一般的な形式は次のようになります。

scheme://[userinfo@]host/path[?query][#fragment]

このRaw、RawAuthority、RawQueryフィールドは「通信フォーマット」であり、特殊文字が特別な意味を持たない限り16進エスケープされます。その他のフィールドには、’+'や’%'はそのまま格納されます。

これらのRaw値は、電文フォーマットに使われるため、一般的にクライアントは、デコードする前に、これらを分割する必要があります。

type URL struct {
    Raw          string // 元の文字列
    Scheme       string // スキーマ
    RawAuthority string // [userinfo@]host
    RawUserinfo  string // ユーザ情報
    Host         string // ホスト
    RawPath      string // /path[?query][#fragment]
    Path         string // /path
    OpaquePath   bool   // パスが不明確 (スキーマが指定されたのにルートからのパスでない)
    RawQuery     string // クエリ
    Fragment     string // フラグメント
}

ParseURL関数

func ParseURL(rawurl string) (url *URL, err os.Error)

ParseURLは、rawurlを解析してURL構造体を作成します。rawurl文字列内には、#fragmentサフィックスが含まれていないとみなして処理します。(ウェブブラウザは、URLをウェブサーバに送信する前に#fragmentを取り除きます。)

ParseURLReference関数

func ParseURLReference(rawurlref string) (url *URL, err os.Error)

ParseURLReferenceは、ParseURLと同じですが、URLのあとに続く#fragmentを処理します。

(*URL) String関数

func (url *URL) String() string

Stringは、有効なURL文字列を再構築します。

URL構造体には冗長なフィールドがあります。このStringメソッドではRaw、RawPathフィールドは使用せず、Scheme、Path、Host、RawUserinfo、RawQuery、Fragmentフィールドを使用します。

URLError型

URLErrorは、エラーとそれを引き起こした操作およびURLを報告します。

type URLError struct {
    Op    string
    URL   string
    Error os.Error
}

(*URLError) String関数

func (e *URLError) String() string

URLEscapeError型

type URLEscapeError string

(URLEscapeError) String関数

func (e URLEscapeError) String() string