gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

errors.go (4625B)


      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 func (e ErrCode) stringToken() string {
     57 	if s, ok := errCodeName[e]; ok {
     58 		return s
     59 	}
     60 	return fmt.Sprintf("ERR_UNKNOWN_%d", uint32(e))
     61 }
     62 
     63 // ConnectionError is an error that results in the termination of the
     64 // entire connection.
     65 type ConnectionError ErrCode
     66 
     67 func (e ConnectionError) Error() string { return fmt.Sprintf("connection error: %s", ErrCode(e)) }
     68 
     69 // StreamError is an error that only affects one stream within an
     70 // HTTP/2 connection.
     71 type StreamError struct {
     72 	StreamID uint32
     73 	Code     ErrCode
     74 	Cause    error // optional additional detail
     75 }
     76 
     77 // errFromPeer is a sentinel error value for StreamError.Cause to
     78 // indicate that the StreamError was sent from the peer over the wire
     79 // and wasn't locally generated in the Transport.
     80 var errFromPeer = errors.New("received from peer")
     81 
     82 func streamError(id uint32, code ErrCode) StreamError {
     83 	return StreamError{StreamID: id, Code: code}
     84 }
     85 
     86 func (e StreamError) Error() string {
     87 	if e.Cause != nil {
     88 		return fmt.Sprintf("stream error: stream ID %d; %v; %v", e.StreamID, e.Code, e.Cause)
     89 	}
     90 	return fmt.Sprintf("stream error: stream ID %d; %v", e.StreamID, e.Code)
     91 }
     92 
     93 // 6.9.1 The Flow Control Window
     94 // "If a sender receives a WINDOW_UPDATE that causes a flow control
     95 // window to exceed this maximum it MUST terminate either the stream
     96 // or the connection, as appropriate. For streams, [...]; for the
     97 // connection, a GOAWAY frame with a FLOW_CONTROL_ERROR code."
     98 type goAwayFlowError struct{}
     99 
    100 func (goAwayFlowError) Error() string { return "connection exceeded flow control window size" }
    101 
    102 // connError represents an HTTP/2 ConnectionError error code, along
    103 // with a string (for debugging) explaining why.
    104 //
    105 // Errors of this type are only returned by the frame parser functions
    106 // and converted into ConnectionError(Code), after stashing away
    107 // the Reason into the Framer's errDetail field, accessible via
    108 // the (*Framer).ErrorDetail method.
    109 type connError struct {
    110 	Code   ErrCode // the ConnectionError error code
    111 	Reason string  // additional reason
    112 }
    113 
    114 func (e connError) Error() string {
    115 	return fmt.Sprintf("http2: connection error: %v: %v", e.Code, e.Reason)
    116 }
    117 
    118 type pseudoHeaderError string
    119 
    120 func (e pseudoHeaderError) Error() string {
    121 	return fmt.Sprintf("invalid pseudo-header %q", string(e))
    122 }
    123 
    124 type duplicatePseudoHeaderError string
    125 
    126 func (e duplicatePseudoHeaderError) Error() string {
    127 	return fmt.Sprintf("duplicate pseudo-header %q", string(e))
    128 }
    129 
    130 type headerFieldNameError string
    131 
    132 func (e headerFieldNameError) Error() string {
    133 	return fmt.Sprintf("invalid header field name %q", string(e))
    134 }
    135 
    136 type headerFieldValueError string
    137 
    138 func (e headerFieldValueError) Error() string {
    139 	return fmt.Sprintf("invalid header field value for %q", string(e))
    140 }
    141 
    142 var (
    143 	errMixPseudoHeaderTypes = errors.New("mix of request and response pseudo headers")
    144 	errPseudoAfterRegular   = errors.New("pseudo header field after regular")
    145 )