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
Comments