v1.0.3 — ревью Соннета: SSRF fix, go.sum, readyz, sort, graceful shutdown, gofmt
This commit is contained in:
+40
-8
@@ -10,7 +10,11 @@ import (
|
||||
"net/http"
|
||||
"net/url"
|
||||
"os"
|
||||
"os/signal"
|
||||
"sort"
|
||||
"strings"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
s3 "github.com/minio/minio-go/v7"
|
||||
"github.com/minio/minio-go/v7/pkg/credentials"
|
||||
@@ -23,7 +27,7 @@ var (
|
||||
s3Prefix = os.Getenv("S3_PREFIX") // S3 key prefix (may differ from hostname)
|
||||
)
|
||||
|
||||
const VERSION = "1.0.2"
|
||||
const VERSION = "1.0.3"
|
||||
|
||||
// Terraform Registry Protocol Structs
|
||||
type Discovery struct {
|
||||
@@ -108,8 +112,27 @@ func main() {
|
||||
if port == "" {
|
||||
port = "5000"
|
||||
}
|
||||
log.Printf("Starting Registry Service on :%s (Bucket: %s, Endpoint: %s)\n", port, bucketName, endpoint)
|
||||
log.Fatal(http.ListenAndServe(":"+port, nil))
|
||||
|
||||
srv := &http.Server{Addr: ":" + port}
|
||||
|
||||
go func() {
|
||||
log.Printf("Starting Registry Service on :%s (Bucket: %s, Endpoint: %s)\n", port, bucketName, endpoint)
|
||||
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
|
||||
log.Fatalf("HTTP server error: %v", err)
|
||||
}
|
||||
}()
|
||||
|
||||
quit := make(chan os.Signal, 1)
|
||||
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
|
||||
<-quit
|
||||
log.Println("Shutting down server...")
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
||||
defer cancel()
|
||||
if err := srv.Shutdown(ctx); err != nil {
|
||||
log.Fatalf("Server forced to shutdown: %v", err)
|
||||
}
|
||||
log.Println("Server stopped")
|
||||
}
|
||||
|
||||
func rootHandler(w http.ResponseWriter, r *http.Request) {
|
||||
@@ -133,15 +156,14 @@ func rootHandler(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
func proxyHandler(w http.ResponseWriter, r *http.Request) {
|
||||
bucket := r.URL.Query().Get("bucket")
|
||||
key := r.URL.Query().Get("key")
|
||||
|
||||
if bucket == "" || key == "" {
|
||||
http.Error(w, "Missing bucket or key params", http.StatusBadRequest)
|
||||
if key == "" {
|
||||
http.Error(w, "Missing key param", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
|
||||
obj, err := s3Client.GetObject(context.Background(), bucket, key, s3.GetObjectOptions{})
|
||||
obj, err := s3Client.GetObject(context.Background(), bucketName, key, s3.GetObjectOptions{})
|
||||
if err != nil {
|
||||
log.Printf("Error getting object %s/%s: %v", bucket, key, err)
|
||||
http.Error(w, "File not found", http.StatusNotFound)
|
||||
@@ -232,6 +254,10 @@ func listVersions(w http.ResponseWriter, r *http.Request, namespace, pType strin
|
||||
versions = append(versions, *v)
|
||||
}
|
||||
|
||||
sort.Slice(versions, func(i, j int) bool {
|
||||
return versions[i].Version < versions[j].Version
|
||||
})
|
||||
|
||||
resp := VersionList{
|
||||
ID: fmt.Sprintf("%s/%s", namespace, pType),
|
||||
Versions: versions,
|
||||
@@ -294,7 +320,13 @@ func healthzHandler(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
func readyzHandler(w http.ResponseWriter, r *http.Request) {
|
||||
// Проверить доступность S3
|
||||
_, err := s3Client.BucketExists(context.Background(), bucketName)
|
||||
if err != nil {
|
||||
log.Printf("readyz: S3 bucket check failed: %v", err)
|
||||
w.WriteHeader(http.StatusServiceUnavailable)
|
||||
w.Write([]byte("s3 unreachable"))
|
||||
return
|
||||
}
|
||||
w.WriteHeader(http.StatusOK)
|
||||
w.Write([]byte("ok"))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user