ParseURL parses an URL into options that can be used to connect to PostgreSQL.
(sURL string)
| 192 | |
| 193 | // ParseURL parses an URL into options that can be used to connect to PostgreSQL. |
| 194 | func ParseURL(sURL string) (*Options, error) { |
| 195 | parsedURL, err := url.Parse(sURL) |
| 196 | if err != nil { |
| 197 | return nil, err |
| 198 | } |
| 199 | |
| 200 | // scheme |
| 201 | if parsedURL.Scheme != "postgres" && parsedURL.Scheme != "postgresql" { |
| 202 | return nil, errors.New("pg: invalid scheme: " + parsedURL.Scheme) |
| 203 | } |
| 204 | |
| 205 | // host and port |
| 206 | options := &Options{ |
| 207 | Addr: parsedURL.Host, |
| 208 | } |
| 209 | if !strings.Contains(options.Addr, ":") { |
| 210 | options.Addr += ":5432" |
| 211 | } |
| 212 | |
| 213 | // username and password |
| 214 | if parsedURL.User != nil { |
| 215 | options.User = parsedURL.User.Username() |
| 216 | |
| 217 | if password, ok := parsedURL.User.Password(); ok { |
| 218 | options.Password = password |
| 219 | } |
| 220 | } |
| 221 | |
| 222 | if options.User == "" { |
| 223 | options.User = "postgres" |
| 224 | } |
| 225 | |
| 226 | // database |
| 227 | if len(strings.Trim(parsedURL.Path, "/")) > 0 { |
| 228 | options.Database = parsedURL.Path[1:] |
| 229 | } else { |
| 230 | return nil, errors.New("pg: database name not provided") |
| 231 | } |
| 232 | |
| 233 | // ssl mode |
| 234 | query, err := url.ParseQuery(parsedURL.RawQuery) |
| 235 | if err != nil { |
| 236 | return nil, err |
| 237 | } |
| 238 | |
| 239 | if sslMode, ok := query["sslmode"]; ok && len(sslMode) > 0 { |
| 240 | switch sslMode[0] { |
| 241 | case "verify-ca", "verify-full": |
| 242 | options.TLSConfig = &tls.Config{} |
| 243 | case "allow", "prefer", "require": |
| 244 | options.TLSConfig = &tls.Config{InsecureSkipVerify: true} //nolint |
| 245 | case "disable": |
| 246 | options.TLSConfig = nil |
| 247 | default: |
| 248 | return nil, fmt.Errorf("pg: sslmode '%v' is not supported", sslMode[0]) |
| 249 | } |
| 250 | } else { |
| 251 | options.TLSConfig = &tls.Config{InsecureSkipVerify: true} //nolint |
searching dependent graphs…