Skip to content

datamodel-code-generator > 0.40.0 fails when using --url with a custom port #2931

@GianlucaFicarelli

Description

@GianlucaFicarelli

Describe the bug
datamodel-code-generator > 0.40.0 fails when using --url with a custom port and retrieving a schema with $ref.

To Reproduce

Example schema:

{
  "openapi": "3.0.0",
  "info": {
    "title": "Minimal API",
    "version": "1.0.0"
  },
  "paths": {},
  "components": {
    "schemas": {
      "Item": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "owner": {
            "$ref": "#/components/schemas/User"
          }
        }
      },
      "User": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          }
        }
      }
    }
  }
}

Used commandline to start a server in the same directory where openapi.json is saved:

$ python -m http.server 8123

Used commandline:

$ datamodel-codegen --url http://127.0.0.1:8123/openapi.json

Expected behavior
The output should show the generated code as in version 0.40.0.

Version:

  • OS: macOS 15.5
  • Python version: 3.11.11
  • datamodel-code-generator version: 0.52.1

Additional context
The error is httpx.ConnectError: [Errno 61] Connection refused

Looking at the logs, it seems that datamodel-codegen makes a first successful request to the endpoint, then it tries to make a new request to the wrong port 80, failing at:

return self.remote_object_cache.get_or_put(

Full traceback:

The input file type was determined to be: openapi
This can be specified explicitly with the `--input-file-type` option.
Traceback (most recent call last):
  File ".venv/lib/python3.11/site-packages/httpx/_transports/default.py", line 101, in map_httpcore_exceptions
    yield
  File ".venv/lib/python3.11/site-packages/httpx/_transports/default.py", line 250, in handle_request
    resp = self._pool.handle_request(req)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".venv/lib/python3.11/site-packages/httpcore/_sync/connection_pool.py", line 256, in handle_request
    raise exc from None
  File ".venv/lib/python3.11/site-packages/httpcore/_sync/connection_pool.py", line 236, in handle_request
    response = connection.handle_request(
               ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".venv/lib/python3.11/site-packages/httpcore/_sync/connection.py", line 101, in handle_request
    raise exc
  File ".venv/lib/python3.11/site-packages/httpcore/_sync/connection.py", line 78, in handle_request
    stream = self._connect(request)
             ^^^^^^^^^^^^^^^^^^^^^^
  File ".venv/lib/python3.11/site-packages/httpcore/_sync/connection.py", line 124, in _connect
    stream = self._network_backend.connect_tcp(**kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".venv/lib/python3.11/site-packages/httpcore/_backends/sync.py", line 207, in connect_tcp
    with map_exceptions(exc_map):
  File "/Users/me/.local/share/uv/python/cpython-3.11.11-macos-aarch64-none/lib/python3.11/contextlib.py", line 158, in __exit__
    self.gen.throw(typ, value, traceback)
  File ".venv/lib/python3.11/site-packages/httpcore/_exceptions.py", line 14, in map_exceptions
    raise to_exc(exc) from exc
httpcore.ConnectError: [Errno 61] Connection refused

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File ".venv/lib/python3.11/site-packages/datamodel_code_generator/__main__.py", line 1363, in main
    run_generate_from_config(
  File ".venv/lib/python3.11/site-packages/datamodel_code_generator/__main__.py", line 938, in run_generate_from_config
    result = generate(
             ^^^^^^^^^
  File ".venv/lib/python3.11/site-packages/datamodel_code_generator/__init__.py", line 764, in generate
    results = parser.parse(
              ^^^^^^^^^^^^^
  File ".venv/lib/python3.11/site-packages/datamodel_code_generator/parser/base.py", line 3107, in parse
    self.parse_raw()
  File ".venv/lib/python3.11/site-packages/datamodel_code_generator/parser/openapi.py", line 753, in parse_raw
    self.parse_raw_obj(
  File ".venv/lib/python3.11/site-packages/datamodel_code_generator/parser/jsonschema.py", line 3580, in parse_raw_obj
    self.parse_obj(name, obj, path)
  File ".venv/lib/python3.11/site-packages/datamodel_code_generator/parser/jsonschema.py", line 3622, in parse_obj
    self.parse_object(name, obj, path)
  File ".venv/lib/python3.11/site-packages/datamodel_code_generator/parser/jsonschema.py", line 2481, in parse_object
    fields = self.parse_object_fields(
             ^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".venv/lib/python3.11/site-packages/datamodel_code_generator/parser/openapi.py", line 304, in parse_object_fields
    fields = super().parse_object_fields(obj, path, module_name, class_name=class_name)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".venv/lib/python3.11/site-packages/datamodel_code_generator/parser/jsonschema.py", line 2421, in parse_object_fields
    field_type = self.parse_item(modular_name, field, [*path, field_name])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".venv/lib/python3.11/site-packages/datamodel_code_generator/parser/jsonschema.py", line 2767, in parse_item
    return self.get_ref_data_type(item.ref)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".venv/lib/python3.11/site-packages/datamodel_code_generator/parser/openapi.py", line 294, in get_ref_data_type
    return super().get_ref_data_type(ref)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".venv/lib/python3.11/site-packages/datamodel_code_generator/parser/jsonschema.py", line 1124, in get_ref_data_type
    ref_schema = self._load_ref_schema_object(ref)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".venv/lib/python3.11/site-packages/datamodel_code_generator/parser/jsonschema.py", line 1379, in _load_ref_schema_object
    raw_doc = self._get_ref_body(file_part) if file_part else self.raw_obj
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".venv/lib/python3.11/site-packages/datamodel_code_generator/parser/jsonschema.py", line 3387, in _get_ref_body
    return self._get_ref_body_from_url(resolved_ref)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".venv/lib/python3.11/site-packages/datamodel_code_generator/parser/jsonschema.py", line 3406, in _get_ref_body_from_url
    return self.remote_object_cache.get_or_put(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".venv/lib/python3.11/site-packages/datamodel_code_generator/parser/__init__.py", line 44, in get_or_put
    value = self[key] = default_factory(key)
                        ^^^^^^^^^^^^^^^^^^^^
  File ".venv/lib/python3.11/site-packages/datamodel_code_generator/parser/jsonschema.py", line 3407, in <lambda>
    ref, default_factory=lambda key: load_data(self._get_text_from_url(key))
                                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".venv/lib/python3.11/site-packages/datamodel_code_generator/parser/base.py", line 1046, in _get_text_from_url
    return self.remote_text_cache.get_or_put(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".venv/lib/python3.11/site-packages/datamodel_code_generator/parser/__init__.py", line 44, in get_or_put
    value = self[key] = default_factory(key)
                        ^^^^^^^^^^^^^^^^^^^^
  File ".venv/lib/python3.11/site-packages/datamodel_code_generator/parser/base.py", line 1048, in <lambda>
    default_factory=lambda _url: get_body(
                                 ^^^^^^^^^
  File ".venv/lib/python3.11/site-packages/datamodel_code_generator/http.py", line 38, in get_body
    return httpx.get(
           ^^^^^^^^^^
  File ".venv/lib/python3.11/site-packages/httpx/_api.py", line 195, in get
    return request(
           ^^^^^^^^
  File ".venv/lib/python3.11/site-packages/httpx/_api.py", line 109, in request
    return client.request(
           ^^^^^^^^^^^^^^^
  File ".venv/lib/python3.11/site-packages/httpx/_client.py", line 825, in request
    return self.send(request, auth=auth, follow_redirects=follow_redirects)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".venv/lib/python3.11/site-packages/httpx/_client.py", line 914, in send
    response = self._send_handling_auth(
               ^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".venv/lib/python3.11/site-packages/httpx/_client.py", line 942, in _send_handling_auth
    response = self._send_handling_redirects(
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".venv/lib/python3.11/site-packages/httpx/_client.py", line 979, in _send_handling_redirects
    response = self._send_single_request(request)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".venv/lib/python3.11/site-packages/httpx/_client.py", line 1014, in _send_single_request
    response = transport.handle_request(request)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".venv/lib/python3.11/site-packages/httpx/_transports/default.py", line 249, in handle_request
    with map_httpcore_exceptions():
  File "/Users/me/.local/share/uv/python/cpython-3.11.11-macos-aarch64-none/lib/python3.11/contextlib.py", line 158, in __exit__
    self.gen.throw(typ, value, traceback)
  File ".venv/lib/python3.11/site-packages/httpx/_transports/default.py", line 118, in map_httpcore_exceptions
    raise mapped_exc(message) from exc
httpx.ConnectError: [Errno 61] Connection refused

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workinggood first issueGood for newcomers

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions