# package httputil
`import "net/http/httputil"`
httputil包提供了HTTP公用函數,是對net/http包的更常見函數的補充。
## Index
* [Variables](#pkg-variables)
* [func DumpRequest(req \*http.Request, body bool) (dump []byte, err error)](#DumpRequest)
* [func DumpRequestOut(req \*http.Request, body bool) ([]byte, error)](#DumpRequestOut)
* [func DumpResponse(resp \*http.Response, body bool) (dump []byte, err error)](#DumpResponse)
* [func NewChunkedReader(r io.Reader) io.Reader](#NewChunkedReader)
* [func NewChunkedWriter(w io.Writer) io.WriteCloser](#NewChunkedWriter)
* [type ClientConn](#ClientConn)
* [func NewClientConn(c net.Conn, r \*bufio.Reader) \*ClientConn](#NewClientConn)
* [func NewProxyClientConn(c net.Conn, r \*bufio.Reader) \*ClientConn](#NewProxyClientConn)
* [func (cc \*ClientConn) Pending() int](#ClientConn.Pending)
* [func (cc \*ClientConn) Write(req \*http.Request) (err error)](#ClientConn.Write)
* [func (cc \*ClientConn) Read(req \*http.Request) (resp \*http.Response, err error)](#ClientConn.Read)
* [func (cc \*ClientConn) Do(req \*http.Request) (resp \*http.Response, err error)](#ClientConn.Do)
* [func (cc \*ClientConn) Hijack() (c net.Conn, r \*bufio.Reader)](#ClientConn.Hijack)
* [func (cc \*ClientConn) Close() error](#ClientConn.Close)
* [type ServerConn](#ServerConn)
* [func NewServerConn(c net.Conn, r \*bufio.Reader) \*ServerConn](#NewServerConn)
* [func (sc \*ServerConn) Pending() int](#ServerConn.Pending)
* [func (sc \*ServerConn) Read() (req \*http.Request, err error)](#ServerConn.Read)
* [func (sc \*ServerConn) Write(req \*http.Request, resp \*http.Response) error](#ServerConn.Write)
* [func (sc \*ServerConn) Hijack() (c net.Conn, r \*bufio.Reader)](#ServerConn.Hijack)
* [func (sc \*ServerConn) Close() error](#ServerConn.Close)
* [type ReverseProxy](#ReverseProxy)
* [func NewSingleHostReverseProxy(target \*url.URL) \*ReverseProxy](#NewSingleHostReverseProxy)
* [func (p \*ReverseProxy) ServeHTTP(rw http.ResponseWriter, req \*http.Request)](#ReverseProxy.ServeHTTP)
## Variables
```
var (
ErrPersistEOF = &http.ProtocolError{ErrorString: "persistent connection closed"}
ErrClosed = &http.ProtocolError{ErrorString: "connection closed by user"}
ErrPipeline = &http.ProtocolError{ErrorString: "pipeline error"}
)
```
```
var ErrLineTooLong = errors.New("header line too long")
```
## func [DumpRequest](http://code.google.com/p/go/source/browse/src/pkg/net/http/httputil/dump.go?name=release#176 "View Source")
```
func DumpRequest(req *http.Request, body bool) (dump []byte, err error)
```
DumpRequest返回req的和被服務端接收到時一樣的有線表示,可選地包括請求的主體,用于debug。本函數在語義上是無操作的,但為了轉儲請求主體,他會讀取主體的數據到內存中,并將req.Body修改為指向內存中的拷貝。req的字段的使用細節請參見http.Request的文檔。
## func [DumpRequestOut](http://code.google.com/p/go/source/browse/src/pkg/net/http/httputil/dump.go?name=release#61 "View Source")
```
func DumpRequestOut(req *http.Request, body bool) ([]byte, error)
```
DumpRequestOut類似DumpRequest,但會包括標準http.Transport類型添加的頭域,如User-Agent。
## func [DumpResponse](http://code.google.com/p/go/source/browse/src/pkg/net/http/httputil/dump.go?name=release#251 "View Source")
```
func DumpResponse(resp *http.Response, body bool) (dump []byte, err error)
```
DumpResponse類似DumpRequest,但轉儲的是一個回復。
## func [NewChunkedReader](http://code.google.com/p/go/source/browse/src/pkg/net/http/httputil/httputil.go?name=release#17 "View Source")
```
func NewChunkedReader(r io.Reader) io.Reader
```
NewChunkedReader返回一個io.Reader。返回值的Read方法會將從r讀取的采用HTTP "chunked"傳輸編碼的數據翻譯之后返回。當讀取到最后的零長chunk時,返回值的Read會返回io.EOF。
NewChunkedReader在正常的應用中是不需要的,http包在讀取回復主體時會自動將"chunked"編碼進行解碼。
## func [NewChunkedWriter](http://code.google.com/p/go/source/browse/src/pkg/net/http/httputil/httputil.go?name=release#30 "View Source")
```
func NewChunkedWriter(w io.Writer) io.WriteCloser
```
NewChunkedWriter返回一個io.Writer。返回值的Write方法會將寫入的數據編碼為HTTP "chunked"傳輸編碼格式后再寫入w。其Close方法會將最后的零長chunk寫入w,標注數據流的結尾。
正常的應用中不需要NewChunkedWriter,http包會在處理器未設置Content-Length頭時主動進行chunked編碼。在處理器內部使用本函數會導致雙重chunked或者有Content-Length頭的chunked,兩個都是錯誤的。
## type [ClientConn](http://code.google.com/p/go/source/browse/src/pkg/net/http/httputil/persist.go?name=release#229 "View Source")
```
type ClientConn struct {
// 內含隱藏或非導出字段
}
```
ClientConn類型會在尊重HTTP keepalive邏輯的前提下,在下層的連接上發送請求和接收回復的頭域。ClientConn類型支持通過Hijack方法劫持下層連接,取回對下層連接的控制權,按照調用者的預期處理該連接。
ClientConn是舊的、低層次的。應用程序應使用net/http包的Client類型和Transport類型代替它。
### func [NewClientConn](http://code.google.com/p/go/source/browse/src/pkg/net/http/httputil/persist.go?name=release#247 "View Source")
```
func NewClientConn(c net.Conn, r *bufio.Reader) *ClientConn
```
NewClientConn返回一個對c進行讀寫的ClientConn。如果r不是nil,它是從c讀取時使用的緩沖。
### func [NewProxyClientConn](http://code.google.com/p/go/source/browse/src/pkg/net/http/httputil/persist.go?name=release#264 "View Source")
```
func NewProxyClientConn(c net.Conn, r *bufio.Reader) *ClientConn
```
NewProxyClientConn類似NewClientConn,但使用Request.WriteProxy方法將請求寫入c。
### func (\*ClientConn) [Pending](http://code.google.com/p/go/source/browse/src/pkg/net/http/httputil/persist.go?name=release#351 "View Source")
```
func (cc *ClientConn) Pending() int
```
Pending返回該連接上已發送但還未接收到回復的請求的數量。
### func (\*ClientConn) [Write](http://code.google.com/p/go/source/browse/src/pkg/net/http/httputil/persist.go?name=release#298 "View Source")
```
func (cc *ClientConn) Write(req *http.Request) (err error)
```
Write寫入一個請求。如果該連接已經在HTTP keepalive邏輯上關閉了(表示該連接不會再發送新的請求)返回ErrPersistEOF。如果req.Close設置為真,keepalive連接會在這次請求后邏輯上關閉,并通知遠端的服務器。ErrUnexpectedEOF表示遠端關閉了下層的TCP連接,這一般被視為優雅的(正常的)關閉。
### func (\*ClientConn) [Read](http://code.google.com/p/go/source/browse/src/pkg/net/http/httputil/persist.go?name=release#361 "View Source")
```
func (cc *ClientConn) Read(req *http.Request) (resp *http.Response, err error)
```
Read讀取下一個回復。合法的回復可能會和ErrPersistEOF一起返回,這表示遠端要求該請求是最后一個被服務的請求。Read可以和Write同時調用,但不能和另一個Read同時調用。
### func (\*ClientConn) [Do](http://code.google.com/p/go/source/browse/src/pkg/net/http/httputil/persist.go?name=release#423 "View Source")
```
func (cc *ClientConn) Do(req *http.Request) (resp *http.Response, err error)
```
Do是一個便利方法,它會寫入一個請求,并讀取一個回復。(能不能保證二者對應?不知道)
### func (\*ClientConn) [Hijack](http://code.google.com/p/go/source/browse/src/pkg/net/http/httputil/persist.go?name=release#274 "View Source")
```
func (cc *ClientConn) Hijack() (c net.Conn, r *bufio.Reader)
```
Hijack拆開ClientConn返回下層的連接和讀取側的緩沖,其中可能有部分剩余的數據。Hijack可以在調用者自身或者其Read方法發出keepalive邏輯的終止信號之前調用。調用者不應在Write或Read執行過程中調用Hijack。
### func (\*ClientConn) [Close](http://code.google.com/p/go/source/browse/src/pkg/net/http/httputil/persist.go?name=release#285 "View Source")
```
func (cc *ClientConn) Close() error
```
Close調用Hijack,然后關閉下層的連接。
## type [ServerConn](http://code.google.com/p/go/source/browse/src/pkg/net/http/httputil/persist.go?name=release#36 "View Source")
```
type ServerConn struct {
// 內含隱藏或非導出字段
}
```
ServerConn類型在下層的連接上接收請求和發送回復,直到HTTP keepalive邏輯結束。ServerConn類型支持通過Hijack方法劫持下層連接,取回對下層連接的控制權,按照調用者的預期處理該連接。ServerConn支持管道內套,例如,請求可以不和回復的發送同步的讀取(但仍按照相同的順序)。
ServerConn是舊的、低層次的。應用程序應使用net/http包的Server類型代替它。
### func [NewServerConn](http://code.google.com/p/go/source/browse/src/pkg/net/http/httputil/persist.go?name=release#53 "View Source")
```
func NewServerConn(c net.Conn, r *bufio.Reader) *ServerConn
```
NewServerConn返回一個新的從c讀寫的ServerConn。如果r補位nil,它將作為從c讀取時的緩沖。
### func (\*ServerConn) [Pending](http://code.google.com/p/go/source/browse/src/pkg/net/http/httputil/persist.go?name=release#163 "View Source")
```
func (sc *ServerConn) Pending() int
```
Pending返回該連接上已接收到但還未回復的請求的數量。
### func (\*ServerConn) [Read](http://code.google.com/p/go/source/browse/src/pkg/net/http/httputil/persist.go?name=release#87 "View Source")
```
func (sc *ServerConn) Read() (req *http.Request, err error)
```
Read讀取下一個請求。如果它優雅的決定不會再有更多的請求(例如,在HTTP/1.0連接的第一個請求之后,或者HTTP/1.1的一個具有" Connection:close "頭的請求之后),會返回ErrPersistEOF。
### func (\*ServerConn) [Write](http://code.google.com/p/go/source/browse/src/pkg/net/http/httputil/persist.go?name=release#172 "View Source")
```
func (sc *ServerConn) Write(req *http.Request, resp *http.Response) error
```
Write寫入req的回復resp。如要優雅的關閉該連接,可以設置resp.Close字段為真。Write方法應該盡量執行(以回復盡量多的請求),直到Write本身返回錯誤,而不應考慮讀取側返回的任何錯誤。
### func (\*ServerConn) [Hijack](http://code.google.com/p/go/source/browse/src/pkg/net/http/httputil/persist.go?name=release#64 "View Source")
```
func (sc *ServerConn) Hijack() (c net.Conn, r *bufio.Reader)
```
Hijack拆開ServerConn返回下層的連接和讀取側的緩沖,其中可能有部分剩余的數據。Hijack可以在調用者自身或者其Read方法發出keepalive邏輯的終止信號之前調用。調用者不應在Write或Read執行過程中調用Hijack。
### func (\*ServerConn) [Close](http://code.google.com/p/go/source/browse/src/pkg/net/http/httputil/persist.go?name=release#75 "View Source")
```
func (sc *ServerConn) Close() error
```
Close調用Hijack,然后關閉下層的連接。
## type [ReverseProxy](http://code.google.com/p/go/source/browse/src/pkg/net/http/httputil/reverseproxy.go?name=release#27 "View Source")
```
type ReverseProxy struct {
// Director必須是將請求修改為新的請求的函數。
// 修改后的請求會使用Transport發送,得到的回復會不經修改的返回給客戶端。
Director func(*http.Request)
// Transport用于執行代理請求。
// 如果本字段為nil,會使用http.DefaultTransport。
Transport http.RoundTripper
// FlushInterval指定拷貝回復的主體時將數據刷新給客戶端的時間間隔。
// 如果本字段為零值,不會進行周期的刷新。(拷貝完回復主體后再刷新)
FlushInterval time.Duration
}
```
ReverseProxy是一個HTTP處理器,它接收一個請求,發送給另一個服務端,將回復轉發給客戶端。
### func [NewSingleHostReverseProxy](http://code.google.com/p/go/source/browse/src/pkg/net/http/httputil/reverseproxy.go?name=release#61 "View Source")
```
func NewSingleHostReverseProxy(target *url.URL) *ReverseProxy
```
NewSingleHostReverseProxy返回一個新的ReverseProxy。返回值會將請求的URL重寫為target參數提供的協議、主機和基路徑。如果target參數的Path字段為"/base",接收到的請求的URL.Path為"/dir",修改后的請求的URL.Path將會是"/base/dir"。
### func (\*ReverseProxy) [ServeHTTP](http://code.google.com/p/go/source/browse/src/pkg/net/http/httputil/reverseproxy.go?name=release#97 "View Source")
```
func (p *ReverseProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request)
```
- 庫
- package achive
- package tar
- package zip
- package bufio
- package builtin
- package bytes
- package compress
- package bzip2
- package flate
- package gzip
- package lzw
- package zlib
- package container
- package heap
- package list
- package ring
- package crypto
- package aes
- package cipher
- package des
- package dsa
- package ecdsa
- package elliptic
- package hmac
- package md5
- package rand
- package rc4
- package rsa
- package sha1
- package sha256
- package sha512
- package subtle
- package tls
- package x509
- package pkix
- package database
- package sql
- package driver
- package encoding
- package ascii85
- package asn1
- package base32
- package base64
- package binary
- package csv
- package gob
- package hex
- package json
- package pem
- package xml
- package errors
- package expvar
- package flag
- package fmt
- package go
- package doc
- package format
- package parser
- package printer
- package hash
- package adler32
- package crc32
- package crc64
- package fnv
- package html
- package template
- package image
- package color
- package palette
- package draw
- package gif
- package jpeg
- package png
- package index
- package suffixarray
- package io
- package ioutil
- package log
- package syslog
- package math
- package big
- package cmplx
- package rand
- package mime
- package multipart
- package net
- package http
- package cgi
- package cookiejar
- package fcgi
- package httptest
- package httputil
- package pprof
- package mail
- package rpc
- package jsonrpc
- package smtp
- package textproto
- package url
- package os
- package exec
- package signal
- package user
- package path
- package filepath
- package reflect
- package regexp
- package runtime
- package cgo
- package debug
- package pprof
- package race
- package sort
- package strconv
- package strings
- package sync
- package atomic
- package text
- package scanner
- package tabwriter
- package template
- package time
- package unicode
- package utf16
- package utf8
- package unsafe