#14523·omi

[Bounty proposal] fix(crossref): normalize encoded DOI resolver URLs before lookup ($25 proposed)

Author: dvdphobiaCreated Sep 18, 2026Updated Sep 18, 2026

Problem

plugins/omi-crossref-app/main.py sends the complete value supplied to get_crossref_work as an opaque Crossref path segment. Bare DOI values work, but copied resolver links with URL-encoded DOI characters, query strings, or fragments are encoded again and Crossref returns 404.

For example, a resolver URL containing an encoded slash and fragment character is currently sent as the full encoded URL rather than as its underlying DOI.

Proposed fix

Normalize at the HTTP boundary:

  • accept bare DOIs, doi: identifiers, and doi.org / dx.doi.org resolver URLs;
  • strip resolver query strings and fragments;
  • decode the resolver path exactly once;
  • reject unrelated URL hosts and malformed DOI values;
  • add hermetic HTTP-boundary regression tests and register them in the shared check manifest.

This is separate from the Crossref title-markup issue in #14307 and the response-shape/client-pooling work in #13978 and #13983.

Verification

The implementation is ready and passes 18 focused tests. I also verified the real user-facing path against Crossref with an encoded special-character DOI; the normalized request returned the expected work.

Proposed bounty: US$25, consistent with recent focused plugin bug-fix proposals.

The research, implementation, and tests were prepared with Codex assistance on behalf of @dvdphobia.

@josancamon19 @kodjima33