# 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