{"record":{"id":"f5d3b7e99c6f2944","repo":"gofr-dev/gofr","slug":"object-name-is-empty-f5d3b7","errorCode":null,"errorMessage":"object name is empty","messagePattern":"object name is empty","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/gofr/datasource/file/ftp/storage_adapter.go","lineNumber":21,"sourceCode":"import (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"path\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/jlaffaye/ftp\"\n\t\"gofr.dev/pkg/gofr/datasource/file\"\n)\n\nvar (\n\t// Storage adapter errors.\n\terrFTPConfigNil            = errors.New(\"FTP config is nil\")\n\terrFTPClientNotInitialized = errors.New(\"FTP client is not initialized\")\n\terrEmptyObjectName         = errors.New(\"object name is empty\")\n\terrInvalidOffset           = errors.New(\"invalid offset: must be >= 0\")\n\terrEmptySourceOrDest       = errors.New(\"source and destination names cannot be empty\")\n\terrSameSourceAndDest       = errors.New(\"source and destination are the same\")\n\terrFailedToCreateReader    = errors.New(\"failed to create reader\")\n\terrFailedToCreateWriter    = errors.New(\"failed to create writer\")\n\terrObjectNotFound          = errors.New(\"object not found\")\n\terrFailedToGetObjectAttrs  = errors.New(\"failed to get object attrs\")\n\terrFailedToDeleteObject    = errors.New(\"failed to delete object\")\n\terrFailedToListObjects     = errors.New(\"failed to list objects\")\n\terrFailedToListDirectory   = errors.New(\"failed to list directory\")\n\terrWriterAlreadyClosed     = errors.New(\"writer already closed\")\n\terrFTPConfigInvalid        = errors.New(\"invalid FTP configuration: host and port are required\")\n)\n\n// Config represents the FTP configuration.\ntype Config struct {\n\tHost        string        // FTP server hostname\n\tUser        string        // FTP username","sourceCodeStart":3,"sourceCodeEnd":39,"githubUrl":"https://github.com/gofr-dev/gofr/blob/187eb24962502e91f1fee856230670958b66e89c/pkg/gofr/datasource/file/ftp/storage_adapter.go#L3-L39","documentation":"errEmptyObjectName is returned by NewReader, NewRangeReader, NewWriter, StatObject and DeleteObject when the object (file) name argument is the empty string. The adapter validates names up front to avoid issuing malformed FTP commands (e.g. RETR \"\").","triggerScenarios":"Passing \"\" as the name to any object operation; deriving a file name from an empty variable, missing path segment, or untrimmed input.","commonSituations":"Empty path variables from config/env; string splitting producing an empty final segment; loops over listings using an uninitialized name variable.","solutions":["Validate name != \"\" (and strings.TrimSpace) before calling the adapter operation.","Fix the upstream source of the name (env var, path parse, request parameter).","Check tests: TestStorageAdapter_NewReader covers this case — mirror it in your own validation."],"exampleFix":"// before\nreader, err := adapter.NewReader(ctx, name) // name == \"\"\n// after\nif strings.TrimSpace(name) == \"\" {\n    return nil, fmt.Errorf(\"object name required\")\n}\nreader, err := adapter.NewReader(ctx, name)","handlingStrategy":"validation","validationCode":"func ensureName(name string) error {\n    if strings.TrimSpace(name) == \"\" {\n        return fmt.Errorf(\"object name must be non-empty\")\n    }\n    return nil\n}","typeGuard":"func validObjectName(name string) bool { return strings.TrimSpace(name) != \"\" }","tryCatchPattern":"if err := ensureName(name); err != nil { return err }\nreader, err := adapter.NewReader(ctx, name)\nif errors.Is(err, errEmptyObjectName) { return fmt.Errorf(\"missing file name: %w\", err) }","preventionTips":["Trim and validate file names at the API boundary before storage calls.","Avoid string splitting that can yield empty final segments.","Fail fast with a clear 400-level message when a client omits a file name."],"tags":["go","ftp","validation","arguments"],"backgroundTag":"empty-object-name","analyzedSha":"187eb24962502e91f1fee856230670958b66e89c","analyzedAt":"2026-09-01T20:34:54.554Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}