| 97 | } |
| 98 | |
| 99 | func (c *HTTP2Connection) ServeHTTP(w http.ResponseWriter, r *http.Request) { |
| 100 | c.activeRequestsWG.Add(1) |
| 101 | defer c.activeRequestsWG.Done() |
| 102 | |
| 103 | connType := determineHTTP2Type(r) |
| 104 | handleMissingRequestParts(connType, r) |
| 105 | |
| 106 | respWriter, err := NewHTTP2RespWriter(r, w, connType, c.log) |
| 107 | if err != nil { |
| 108 | c.observer.log.Error().Msg(err.Error()) |
| 109 | return |
| 110 | } |
| 111 | |
| 112 | originProxy, err := c.orchestrator.GetOriginProxy() |
| 113 | if err != nil { |
| 114 | c.observer.log.Error().Msg(err.Error()) |
| 115 | return |
| 116 | } |
| 117 | |
| 118 | var requestErr error |
| 119 | switch connType { |
| 120 | case TypeControlStream: |
| 121 | requestErr = c.controlStreamHandler.ServeControlStream(r.Context(), respWriter, c.connOptions.ConnectionOptions(), c.orchestrator) |
| 122 | if requestErr != nil { |
| 123 | c.controlStreamErr = requestErr |
| 124 | } |
| 125 | |
| 126 | case TypeConfiguration: |
| 127 | requestErr = c.handleConfigurationUpdate(respWriter, r) |
| 128 | |
| 129 | case TypeWebsocket, TypeHTTP: |
| 130 | stripWebsocketUpgradeHeader(r) |
| 131 | // Check for tracing on request |
| 132 | tr := tracing.NewTracedHTTPRequest(r, c.connIndex, c.log) |
| 133 | if err := originProxy.ProxyHTTP(respWriter, tr, connType == TypeWebsocket); err != nil { |
| 134 | requestErr = fmt.Errorf("Failed to proxy HTTP: %w", err) |
| 135 | } |
| 136 | |
| 137 | case TypeTCP: |
| 138 | host, err := getRequestHost(r) |
| 139 | if err != nil { |
| 140 | requestErr = fmt.Errorf(`cloudflared received a warp-routing request with an empty host value: %w`, err) |
| 141 | break |
| 142 | } |
| 143 | |
| 144 | rws := NewHTTPResponseReadWriterAcker(respWriter, respWriter, r) |
| 145 | requestErr = originProxy.ProxyTCP(r.Context(), rws, &TCPRequest{ |
| 146 | Dest: host, |
| 147 | CFRay: FindCfRayHeader(r), |
| 148 | LBProbe: IsLBProbeRequest(r), |
| 149 | CfTraceID: r.Header.Get(tracing.TracerContextName), |
| 150 | ConnIndex: c.connIndex, |
| 151 | }) |
| 152 | |
| 153 | default: |
| 154 | requestErr = fmt.Errorf("Received unknown connection type: %s", connType) |
| 155 | } |
| 156 | |