Skip to content

MongoDB client failed to use connectionURL containing an IPv6 host #5693

Description

@guyutongxue

For example:

DATABASE_URL='mongodb://[2605:340:c0ff:eeab:be::a25a]:27017/myDatabase' npx prisma db push

Results

Error: P1013

The provided database string is invalid. An invalid argument was provided: address "[2605:340:c0ff:eeab:be::a25a]:27017" contains more than one unescaped ':' in database URL. Please refer to the documentation in https://www.prisma.io/docs/reference/database-reference/connection-urls for constructing a correct connection string. In some cases, certain characters must be escaped. Please check the string for any illegal characters.

And the buggy code is

let mut parts = address.split(':');
let hostname = match parts.next() {
Some(part) => {
if part.is_empty() {
return Err(ErrorKind::invalid_argument(format!(
"invalid server address: \"{address}\"; hostname cannot be empty"
))
.into());
}
part
}
None => {
return Err(
ErrorKind::invalid_argument(format!("invalid server address: \"{address}\"")).into(),
);
}
};
let port = match parts.next() {
Some(part) => {
let port = u16::from_str(part).map_err(|_| {
ErrorKind::invalid_argument(format!(
"port must be valid 16-bit unsigned integer, instead got: {part}"
))
})?;
if port == 0 {
return Err(ErrorKind::invalid_argument(format!(
"invalid server address: \"{address}\"; port must be non-zero"
))
.into());
}
if parts.next().is_some() {
return Err(ErrorKind::invalid_argument(format!(
"address \"{address}\" contains more than one unescaped ':'"
))
.into());
}
Some(port)
}
None => None,
};
Ok((hostname.to_lowercase(), port))

which just split the hostname by :... and definitely wrong for IPv6 address.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions