github.com/lianghucheng/zrddz@v0.0.0-20200923083010-c71f680932e2/src/golang.org/x/net/http2/errors.go (about)

     1  // Copyright 2014 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package http2
     6  
     7  import (
     8  	"errors"
     9  	"fmt"
    10  )
    11  
    12  // An ErrCode is an unsigned 32-bit error code as defined in the HTTP/2 spec.
    13  type ErrCode uint32
    14  
    15  const (
    16  	ErrCodeNo                 ErrCode = 0x0
    17  	ErrCodeProtocol           ErrCode = 0x1
    18  	ErrCodeInternal           ErrCode = 0x2
    19  	ErrCodeFlowControl        ErrCode = 0x3
    20  	ErrCodeSettingsTimeout    ErrCode = 0x4
    21  	ErrCodeStreamClosed       ErrCode = 0x5
    22  	ErrCodeFrameSize          ErrCode = 0x6
    23  	ErrCodeRefusedStream      ErrCode = 0x7
    24  	ErrCodeCancel             ErrCode = 0x8
    25  	ErrCodeCompression        ErrCode = 0x9
    26  	ErrCodeConnect            ErrCode = 0xa
    27  	ErrCodeEnhanceYourCalm    ErrCode = 0xb
    28  	ErrCodeInadequateSecurity ErrCode = 0xc
    29  	ErrCodeHTTP11Required     ErrCode = 0xd
    30  )
    31  
    32  var errCodeName = map[ErrCode]string{
    33  	ErrCodeNo:                 "NO_ERROR",
    34  	ErrCodeProtocol:           "PROTOCOL_ERROR",
    35  	ErrCodeInternal:           "INTERNAL_ERROR",
    36  	ErrCodeFlowControl:        "FLOW_CONTROL_ERROR",
    37  	ErrCodeSettingsTimeout:    "SETTINGS_TIMEOUT",
    38  	ErrCodeStreamClosed:       "STREAM_CLOSED",
    39  	ErrCodeFrameSize:          "FRAME_SIZE_ERROR",
    40  	ErrCodeRefusedStream:      "REFUSED_STREAM",
    41  	ErrCodeCancel:             "CANCEL",
    42  	ErrCodeCompression:        "COMPRESSION_ERROR",
    43  	ErrCodeConnect:            "CONNECT_ERROR",
    44  	ErrCodeEnhanceYourCalm:    "ENHANCE_YOUR_CALM",
    45  	ErrCodeInadequateSecurity: "INADEQUATE_SECURITY",
    46  	ErrCodeHTTP11Required:     "HTTP_1_1_REQUIRED",
    47  }
    48  
    49  func (e ErrCode) String() string {
    50  	if s, ok := errCodeName[e]; ok {
    51  		return s
    52  	}
    53  	return fmt.Sprintf("unknown error code 0x%x", uint32(e))
    54  }
    55  
    56  // ConnectionError is an error that results in the termination of the
    57  // entire connection.
    58  type ConnectionError ErrCode
    59  
    60  func (e ConnectionError) Error() string { return fmt.Sprintf("connection error: %s", ErrCode(e)) }
    61  
    62  // StreamError is an error that only affects one stream within an
    63  // HTTP/2 connection.
    64  type StreamError struct {
    65  	StreamID uint32
    66  	Code     ErrCode
    67  	Cause    error // optional additional detail
    68  }
    69  
    70  func streamError(id uint32, code ErrCode) StreamError {
    71  	return StreamError{StreamID: id, Code: code}
    72  }
    73  
    74  func (e StreamError) Error() string {
    75  	if e.Cause != nil {
    76  		return fmt.Sprintf("stream error: stream ID %d; %v; %v", e.StreamID, e.Code, e.Cause)
    77  	}
    78  	return fmt.Sprintf("stream error: stream ID %d; %v", e.StreamID, e.Code)
    79  }
    80  
    81  // 6.9.1 The Flow Control Window
    82  // "If a sender receives a WINDOW_UPDATE that causes a flow control
    83  // window to exceed this maximum it MUST terminate either the stream
    84  // or the connection, as appropriate. For streams, [...]; for the
    85  // connection, a GOAWAY frame with a FLOW_CONTROL_ERROR code."
    86  type goAwayFlowError struct{}
    87  
    88  func (goAwayFlowError) Error() string { return "connection exceeded flow control window size" }
    89  
    90  // connError represents an HTTP/2 ConnectionError error code, along
    91  // with a string (for debugging) explaining why.
    92  //
    93  // Errors of this type are only returned by the frame parser functions
    94  // and converted into ConnectionError(Code), after stashing away
    95  // the Reason into the Framer's errDetail field, accessible via
    96  // the (*Framer).ErrorDetail method.
    97  type connError struct {
    98  	Code   ErrCode // the ConnectionError error code
    99  	Reason string  // additional reason
   100  }
   101  
   102  func (e connError) Error() string {
   103  	return fmt.Sprintf("http2: connection error: %v: %v", e.Code, e.Reason)
   104  }
   105  
   106  type pseudoHeaderError string
   107  
   108  func (e pseudoHeaderError) Error() string {
   109  	return fmt.Sprintf("invalid pseudo-header %q", string(e))
   110  }
   111  
   112  type duplicatePseudoHeaderError string
   113  
   114  func (e duplicatePseudoHeaderError) Error() string {
   115  	return fmt.Sprintf("duplicate pseudo-header %q", string(e))
   116  }
   117  
   118  type headerFieldNameError string
   119  
   120  func (e headerFieldNameError) Error() string {
   121  	return fmt.Sprintf("invalid header field name %q", string(e))
   122  }
   123  
   124  type headerFieldValueError string
   125  
   126  func (e headerFieldValueError) Error() string {
   127  	return fmt.Sprintf("invalid header field value %q", string(e))
   128  }
   129  
   130  var (
   131  	errMixPseudoHeaderTypes = errors.New("mix of request and response pseudo headers")
   132  	errPseudoAfterRegular   = errors.New("pseudo header field after regular")
   133  )