mirror of
				https://codeberg.org/forgejo/forgejo.git
				synced 2025-11-04 08:21:11 +00:00 
			
		
		
		
	
		
			Some checks failed
		
		
	
	testing-integration / test-sqlite (push) Has been skipped
				
			testing-integration / test-unit (push) Has been skipped
				
			testing-integration / test-mariadb (v11.8) (push) Has been skipped
				
			testing-integration / test-mariadb (v10.6) (push) Has been skipped
				
			testing / frontend-checks (push) Has been skipped
				
			testing / backend-checks (push) Has been skipped
				
			testing / test-e2e (push) Has been skipped
				
			testing / test-unit (push) Has been skipped
				
			testing / test-pgsql (push) Has been skipped
				
			testing / test-mysql (push) Has been skipped
				
			testing / test-sqlite (push) Has been skipped
				
			testing / test-remote-cacher (valkey) (push) Has been skipped
				
			testing / test-remote-cacher (redis) (push) Has been skipped
				
			testing / test-remote-cacher (redict) (push) Has been skipped
				
			testing / test-remote-cacher (garnet) (push) Has been skipped
				
			testing / security-check (push) Has been skipped
				
			/ release (push) Has been cancelled
				
			This PR adds HTTP/2 Cleartext (H2C) support for the HTTP server, this allows for reverse proxies to use HTTP/2 instead. ## Test 1. Start Forgejo. 2. Run `curl --http2-prior-knowledge http://localhost:3000`. 3. Observe it doesn't return a error. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8861 Reviewed-by: Gusted <gusted@noreply.codeberg.org> Co-authored-by: sim <git@sgougeon.fr> Co-committed-by: sim <git@sgougeon.fr>
		
			
				
	
	
		
			42 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			42 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright 2019 The Gitea Authors. All rights reserved.
 | 
						|
// SPDX-License-Identifier: MIT
 | 
						|
 | 
						|
package graceful
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
	"crypto/tls"
 | 
						|
	"net"
 | 
						|
	"net/http"
 | 
						|
)
 | 
						|
 | 
						|
func newHTTPServer(network, address, name string, handler http.Handler) (*Server, ServeFunction) {
 | 
						|
	server := NewServer(network, address, name)
 | 
						|
	httpServer := http.Server{
 | 
						|
		Handler:     handler,
 | 
						|
		BaseContext: func(net.Listener) context.Context { return GetManager().HammerContext() },
 | 
						|
	}
 | 
						|
	// Enable H2C for HTTP server
 | 
						|
	httpServer.Protocols = new(http.Protocols)
 | 
						|
	httpServer.Protocols.SetHTTP1(true)
 | 
						|
	httpServer.Protocols.SetHTTP2(true)
 | 
						|
	httpServer.Protocols.SetUnencryptedHTTP2(true)
 | 
						|
	server.OnShutdown = func() {
 | 
						|
		httpServer.SetKeepAlivesEnabled(false)
 | 
						|
	}
 | 
						|
	return server, httpServer.Serve
 | 
						|
}
 | 
						|
 | 
						|
// HTTPListenAndServe listens on the provided network address and then calls Serve
 | 
						|
// to handle requests on incoming connections.
 | 
						|
func HTTPListenAndServe(network, address, name string, handler http.Handler, useProxyProtocol bool) error {
 | 
						|
	server, lHandler := newHTTPServer(network, address, name, handler)
 | 
						|
	return server.ListenAndServe(lHandler, useProxyProtocol)
 | 
						|
}
 | 
						|
 | 
						|
// HTTPListenAndServeTLSConfig listens on the provided network address and then calls Serve
 | 
						|
// to handle requests on incoming connections.
 | 
						|
func HTTPListenAndServeTLSConfig(network, address, name string, tlsConfig *tls.Config, handler http.Handler, useProxyProtocol, proxyProtocolTLSBridging bool) error {
 | 
						|
	server, lHandler := newHTTPServer(network, address, name, handler)
 | 
						|
	return server.ListenAndServeTLSConfig(tlsConfig, lHandler, useProxyProtocol, proxyProtocolTLSBridging)
 | 
						|
}
 |