tests/test.sh exit code (0 → resolved); the classification below is post-hoc and cannot change it.pwd && rg --files
Chunk ID: 24f926 Wall time: 0.0001 seconds Process exited with code 0 Original token count: 21295 Output: Total output lines: 880 /app UPGRADING.md idna/Cargo.toml idna/src/make_uts46_mapping_table.py idna/src/uts46.rs idna/src/IdnaMappingTable.txt idna/src/lib.rs idna/src/punycode.rs idna/src/uts46_mapping_table.rs idna/tests/IdnaTestV2.txt idna/tests/uts46.rs idna/tests/punycode_tests.json idna/tests/tests.rs idna/tests/unit.rs idna/tests/punycode.rs idna/benches/all.rs LICENSE-APACHE data-url/Cargo.toml data-url/src/forgiving_base64.rs data-url/src/mime.rs data-url/src/lib.rs data-url/src/make_base64_decode_table.py data-url/tests/data-urls.json data-url/tests/generated-mime-types.json data-url/tests/base64.json data-url/tests/mime-types.json data-url/tests/wpt.rs data-url/README.md debug_metadata/url.natvis debug_metadata/README.md url/Cargo.toml url/src/host.rs url/src/slicing.rs url/src/origin.rs url/src/quirks.rs url/src/lib.rs url/src/path_segments.rs url/src/parser.rs url/tests/data.rs url/tests/setters_tests.json url/tests/urltestdata.json url/tests/unit.rs url/tests/debugger_visualizer.rs url/benches/parse_url.rs url/fuzz/Cargo.toml url/fuzz/fuzz_targets/parse.rs deny.toml LICENSE-MIT form_urlencoded/LICENSE-APACHE form_urlencoded/LICENSE-MIT form_urlencoded/Cargo.toml form_urlencoded/src/lib.rs SECURITY.md Cargo.lock percent_encoding/Cargo.toml percent_encoding/src/lib.rs Cargo.toml README.md target/debug/libpercent_encoding.rlib target/debug/liburl.rlib target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm.lock target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/8gogjfidpjzej9k6cuay2faf8.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/7ut7t8re1b826btusc5cl4v2x.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/agj3f7qghevfxfr23sr28wexi.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/a15dh6016y9308jgv5e47riq3.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/1kxqi2cpw1wo5d2dnndxvf6q3.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/e4mnmm3s16tqamgbh0pqntiok.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/91l4rjlvxicdixq97uw7o70v7.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/02xsfoa6kzjvu1nw0xxho3nlc.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/czcyo95aiasa68gs2u0oxokxg.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/biwxx8v5me9yij2twxhq1ogap.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/bykpo9u62mbxeguwentguhvb0.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/3aei1d9abwc04gi9rd1cvlj2z.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/46oe1q2uzd5akxevv3r99fzip.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/3t3b1o26rvpnv84xk4nmojy1e.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/deq16zjekzu8qul67ogjv8y31.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/9q2hld4yimftwjnk562e1bqew.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/2s6f3kdxqpgxfxyn1rc4xddur.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/dep-graph.bin target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/2775hsj8wkvgpksif3rqwm63w.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/9tkdo65ae4h7m9v8v0ats5of2.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/agq6p4fnfvqm77rbelsw0i4j6.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/work-products.bin target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/5v2gape4c61vc1ddu1kmo158v.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/28zb8h3ry0uxso7421eb3nt2k.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/epqw3gouk3odnxiuj1jo6hldl.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/bowd06t3jgepd1eidi3j9o54c.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/eekib1ye0fmfgef6oigd601yv.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/9whyp654sppd8k0rv4m5xmp82.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/01n2rtdvib90e2jsthfw51efv.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/900gb2yw76l4nrjafed0vh42m.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/a4enno5fp9euzckooxod3npn4.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/eczojs28z19hh99k6eb0g5j04.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/3soable5b906do9pka3x2j9ur.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/9g6iwsh5jtq52d8cdlz8yh4d1.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/3k910szc0dn0ty4qgva8y2qq8.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/4shhir26nlxxq5pss0w47by52.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/258jnbd9zwu7ew57q7u0253aq.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/cnhr8x0pnp7ugoh3ko1u8qs45.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/ee5cxl6a6evr6lsdy0cpxedow.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/3sebt2r12dsn1uk781qs3rnhj.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/bvlmdykgj4xwvt127xupf70rc.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/9phsq551fyex9j1tmbwzj74vr.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/502vo5unbup48b7ifgx6kehad.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/8rohcv8v1088qjcgbuymfy91d.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/0jbs3vebrmgnlpwe60ls7p9uz.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/9b7c6cf9hhtirf46fm6ecyjza.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/amkb38yht8dmwu1xgq03mti1h.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/de3ip26i8gt65m5od9658kn7r.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/2at9epbxsgpyahlfumu7gjq9i.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/899ugj7od0x8px3v3ujykw1p6.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/83ku5vaflgndgid98zhn9tawa.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/5ajzztpqhrapukd0uwkqipsna.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/1fn1lz061zk82vsndz5wj90o3.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/2qgczw6toiaw1fowj9gsqadxt.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/1mqw1yppynw397arbfl65hnkc.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/1ngss9k430ri6t12wx4v9zvcv.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/c7q5qfhogfqcw1j47ilyzo29x.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/csq4p3al5mzznuslat36pej80.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/a801ynq5m11ijqsdjkejvnu0s.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/98ekh76ol0t5gco2kc98r1jcy.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/bva2kc5y142ksiw58kco1di5h.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/cdzafb4i2ma0gvcjzdxxuifs2.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/6dty9q33gde7ehdujwsipdfj4.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/84sswellw3rrji8t4na9w2sdz.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/bgdylkdpa0do687xtaeak4iyx.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/dadh94qizpyp8wrvsgtcggzlp.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/query-cache.bin target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/3e03aiigsd27mupc64rh449kt.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/d4la7jajgpuc26d6ovpq23u1i.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/2ngb3hc1z6qtb06dq5cf3b3gd.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/4meummhxone2t5amg7j24wr07.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/3en08tqxbksbxhaswgqi0sx28.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/9jih05jud875hiz8en3na0y9j.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/dw4jde1xo1n0w2xa4jntnkut0.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/99lgqd3gkfdf8sehcdf25lcgr.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/6thfx2yz1zd3kkquq26m5mo9s.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/86qduwl8ldk65mozdb3lwi113.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/3clpzgo1jabo9s68qdd232jqb.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/4wxyd8q63l2nsrutm7rkca580.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/77wc4bkdzcxbswmtmuaeya94v.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/6m027519o46e4nno9lrqokkpz.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/7gyyqs9cor3i9yfyf4poizv7a.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/3r59joa5o2hnz85fgblg17ylz.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/6adv5em2rxewf6n5fqd8d7m9d.o target/debug/incremental/url-3624ita5ju63y/s-hjou0ruvk4-1a7xc8r-0i4hmo3dzf6r3t8anyfcx7eg7/dep-graph.bin target/debug/incremental/url-3624ita5ju63y/s-hjou0ruvk4-1a7xc8r-0i4hmo3dzf6r3t8anyfcx7eg7/3sfk52cnzdq3lqldqdla1qavt.o target/debug/incremental/url-3624ita5ju63y/s-hjou0ruvk4-1a7xc8r-0i4hmo3dzf6r3t8anyfcx7eg7/work-products.bin target/debug/incremental/url-3624ita5ju63y/s-hjou0ruvk4-1a7xc8r-0i4hmo3dzf6r3t8anyfcx7eg7/8ilh8nwuzeqny6ljn8jbw2i8k.o target/debug/incremental/url-3624ita5ju63y/s-hjou0ruvk4-1a7xc8r-0i4hmo3dzf6r3t8anyfcx7eg7/4l1vm0j7jhztplafysuoeo49c.o target/debug/incremental/url-3624ita5ju63y/s-hjou0ruvk4-1a7xc8r-0i4hmo3dzf6r3t8anyfcx7eg7/5fd3u3mwmlmcw5h6ml7cnji74.o target/debug/incremental/url-3624ita5ju63y/s-hjou0ruvk4-1a7xc8r-0i4hmo3dzf6r3t8anyfcx7eg7/cz3povjitv5meffkbljpcs39v.o target/debug/incremental/url-3624ita5ju63y/s-hjou0ruvk4-1a7xc8r-0i4hmo3dzf6r3t8anyfcx7eg7/query-cache.bin target/debug/incremental/url-3624ita5ju63y/s-hjou0ruvk4-1a7xc8r-0i4hmo3dzf6r3t8anyfcx7eg7/7nwf44ir5vg1i4bia652z894r.o target/debug/incremental/url-3624ita5ju63y/s-hjou0ruvk4-1a7xc8r.lock target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/7cf9q8hxgewy7fxi1c17o9i05.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/9phx5yraspeaqwxoti1fgnsrn.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/04o9cgx8g2kz956ty9tpsgryb.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/5xo60wnqxg5d0zouu0oozzgbk.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/cb9bhzmp64hcwz0i5a2gb7ljo.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/4jj7m0xmf338g0h9ddeavq5tx.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/dep-graph.bin target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/5xerj1fbrybp04odmprzc2tli.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/work-products.bin target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/29coxn26xu0ucq3jceu8oc66m.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/92bdiyw3s2e5mvu7lwkgu6ivr.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/6s6poscwjxwdt5eyd6ym2r70v.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/7sk2a8sic80511hlwuz5hm29c.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/crxgtrgwuh1dtj2ptf8anhy4f.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/clrbht8a7rpj3ovzul6pwl080.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/4zoqbyoi6510ruh1s7ytygswe.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/3ym2vudmm4uwsebtisb6w517c.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/d4bdaewn9b8y4h2bd93722p17.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/afl8quyys9iwv7z3pvotj3q3e.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/emfetx9zqbl9xkryzrm9rd6dy.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/andomrbsvoso3335e5zhcj1yd.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/2n5wgpdggu3o4ey2pwhf1oujx.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/4mu0gd8b6clv6meqa7tzsdrcm.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/cpax00wsrg6ufv6h0tjjsk9ye.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/query-cache.bin target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/8gp07z2d6oe9s1xrjunbtmxij.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/7fu1fneukssvukuu62i6rlgw7.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/by2di4qiusbvp2t42y12c5clj.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/1s91xfp48o921nrv7o90ulx77.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/cqgmz89vl46h02iy47mi6p6c8.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/1lu2c6mxvsput39c4shrvgd2t.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/a887fs7l9anok7yw5qm1tt9wu.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/afn5x3bhw0mdk58dr58txotre.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/9ejwdbt8hw620lzueki5mdy2r.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/878cwrgtzo3vcpcqv4kutl8x3.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417.lock target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/9othkraw3qbdb5e9ev5eg5rtq.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/cwa0bj1vggn6xjpkf9nhbt9nt.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/cyujqk6vivgcm8twqp2o31aet.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/24pnjujsglbnpa144imdgykot.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/7twjxl7vvtzau3v8q21uk6x9u.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/5x0z02og4td8p1q4ek7ionbpk.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/cvjal1ffqe3tvi7ugt2tr7s24.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/dep-graph.bin target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/2le4kr196w91zykrbz1u38ldy.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/1zkurdy0ajj5ckboo5dkzjdp5.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/work-products.bin target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/27tkn0dgl56qtoxj7edcfivqp.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/e1at3tiumu08k4o2rzvebe97t.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/3nibda4ow4wvc5gijmqhxw72y.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/9vuil794wxxxynqcxqujejul8.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/0u7qi5ddthljzjcpkfc6ta8tr.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/f18ebq8c8rpbwvkctv3cv57sk.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/ai50witipr45wh5lk17f12bdv.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/6dio3aosr8nplwcwufgppoyhd.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/87igb8wed1g5rk6i2ov4tpsrx.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/5dborrn4nvyw8a2bcp2hs7ixt.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/4n2lprkjg52owqvtd3cs0bm1h.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/query-cache.bin target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/budy2lspdszs5dw7y7iww3mg2.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/el8785gtcnf25tu6awe8kr1wy.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/7wkr8rbqzz5uqwno7nh6bql9j.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/eoqjw13y8h2cc0l8sptxpkgou.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/9dvyata0eq51m9lrvm2pikibw.o target/debug/increm…11295 tokens truncated…dqw95.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/4ro337pndi6u8mq3ltkktfamc.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/8r7p6sjrebefmkpstumvn9f7c.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/dep-graph.bin target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/work-products.bin target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/6fd027e4vtb04drzfi3ibc3cy.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/9zrwc851ymvmtfsq2pqpib5uy.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/bkmjsi5y68po5wbn75lpdhupf.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/3985rk03xctcqi5zfib0q9rnq.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/2jum5x7384buq6qoewylcmnds.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/cfln0n5p7ztgntbkcvendyk68.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/cu8ohjtyqfg4mpuwwablueq9e.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/b8khd8v0l61h0tq6h9zykui3a.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/8mep6kq5b8mcakrzy46dileo0.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/3mzt170e2rc0li0bwa4r9dj39.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/query-cache.bin target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/cg8azhw7rv32mkhqq5vbcfg10.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/5lvxv7pmg6atq9ow2okbkke2u.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/5kfjkyy2cf9zqe2ecom52onda.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/73qx2yp1rq54gjsos0laejcub.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/4so737lo0vx00jofsz4ghxjgf.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/729s4twcw4dvbcpmoh0mrwh8p.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw.lock target/debug/libform_urlencoded.rlib target/debug/libform_urlencoded.d target/debug/libpercent_encoding.d target/debug/libidna.rlib target/debug/liburl.d target/debug/libdata_url.d target/debug/libidna.d target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/16mrank5umtrmyio1o8ggdohc.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/0eov6xcb3cxkoj0dza0c7zrov.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/0q26nsy2hw75urq8j8u8de1m1.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/9ylcjemhp24uxct0om6k3zdeh.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/efmedkxy2by267imkj7eaj13a.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/0jrzhm8a1370szlz2niqk6ua4.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/5idn9lrht456fghs23jt0uu25.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/0cty7j0dg6ueh80u4wpa9s2o1.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/4wojuyhe9v2sugp74y1hjmj9w.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/6809ygbq2787l3g4totpw3886.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/7g6eozzvf9uf86hmr1p3t6ymh.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/7egkk04k0cwqbmpk14n54zkbd.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/1w9ggip3r5yvw1ib0lszj7q5q.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/cpd3lf7bfub5o2zpcnj8ms62f.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/83n5zanjqh7u7cdpbpfbylw5d.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/bskett978cnufg3oa1dkn384t.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/dhqgdrxu1wyggalthhbq5ea55.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/dus9hxw1qovzexfbulw8gsgjk.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/b1esjaqdlxbgf2ygwawyaeuaa.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/elz60d1tgq5mxnhd26z7n3si1.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/bqq6dziwi1j5l7dvvqmxqkd1z.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/eh2dcw1tp8oje3nwi5vwb5lad.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/6oogwtkt0i6bmq9u9gplsyaeg.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/42dvma5wqliejr82eyzb2q69w.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/dep-graph.bin target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/374vie5vh0duu1ajn3rnnkfib.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/4jf22m847t81rab5bz84pe5df.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/2dfl0gnco0sc40368c7e20r0r.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/47vol74196wo0j6tquo28jkqh.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/2azj6kiibt5eyokraia0d07q5.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/d14l2ixyjpvk6wdbgvlpimc7n.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/445ncjwk0z08t6g0tbhl29h8m.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/work-products.bin target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/5f1ombqj49vnoomh36cayufa6.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/b2lipmztvegkf1teunq2uj0ao.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/4kdv0bvdwq9gw0f1iw2ex3xhl.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/cyjbtppw3jh4zq1y83dacp1ja.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/8cna0rkcfwkxilm86rds2066t.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/9akcqwg56im4wy0pi3t06r9sv.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/6ugab35o9yqleyreat18b6666.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/ew4nas5lp3gxypvmxmldvbfqu.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/1eyk6frfkd66zloqnqp8fni92.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/e9iwac2wb9smqkg5uwiw6g4yg.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/4pz8qrtlta9z2a597pdwjii9g.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/8sb7n6m3oyk8gfawcp6da5kpf.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/bh8twggzos86tmwav6u8g66r6.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/23icqbbqtb6fh1vg0j2nucrdl.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/49874fpap0bz9ev8wt0oh3jst.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/bcoxddjebok2dxnd5sqmj9vf0.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/64c3wkk340p79p1poyski6azn.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/4noqoa6vh5sk0tt8xgqqbvsm5.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/7u1ap92hc0rjbzokmg35g66f8.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/9r7z0js5b605u71e9osf253jy.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/9o0wf07ejkokkolxhhqyse963.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/acm5nyx4m5n7dq7ohx5zvt4aw.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/4lr2ldlx67yk15v8x340dgu90.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/40gd9wpt86fycn4fgyvix592l.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/61ise8tyush68jvuafwxg7tc2.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/9fzopt7i74e3d2hvsv9ayiu67.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/33ewk0x0fixd108ujewwes8xm.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/6bw77pie55u142ljxsob6dp7d.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/17ipzdtk2bfoc2hihkjlfagtn.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/0uqiempuze711xd3n7g6qowld.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/8y44fbxqsl3hw52ir2jgauam9.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/df1d1d6crlbw7skdgc3ra10mk.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/a93155414jj8u3eea9nlhbjz7.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/5u6j1gxxe61aliwm527klnujn.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/1ycfj2jkxq2cv1jkk554tvlih.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/8o05of94ry9hcqubi0igstt4o.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/bmb7llbmjd5v81iwnszfbvq4o.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/3me9m97na6kimdm6mlhkhr9d4.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/4whcma8tc866ma6ncilkczxbc.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/duwjxu5aefho4hz3di6w04uwh.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/query-cache.bin target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/docrj24u4cc71i69idv1gwvg2.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/53m6w1lqbwsu0ti7wzsh9j0wx.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/8efl2q7pm8bc1qe4le1o61j7f.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/7db4aa24j8eocrz5lyrfj0nrw.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/d6uyc7se8s4xqmsosofikoug0.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/bx4juq239lz1f2o9qd9boce6a.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/8m003xfbyn8who1bk030hdjj0.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/0otxrwmc96bn4uvt0dwss9f5z.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/06m80elx0jwoqg06t0fuif9m8.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/dtyuzookd6p0q32oh0d9easrb.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/6dl4gd0nauy0h0fluun719tyy.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/4v4x7nrekfjjhm0e5355r9on3.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8.lock target/debug/deps/libsyn-e03837b46b547978.rlib target/debug/deps/unit-49bdfe7cb4758172.d target/debug/deps/libdirs_next-9f9ae5649cd83b0e.rlib target/debug/deps/libnum_cpus-b2a4ede6cfed6774.rlib target/debug/deps/idna-726324058677286e.d target/debug/deps/form_urlencoded-95861b6439c1abb6.d target/debug/deps/libunicode_normalization-bbe37813a405e491.rmeta target/debug/deps/libtinyvec_macros-25017543a519123f.rlib target/debug/deps/url-d627b16b64164b50.d target/debug/deps/libtinyvec-a50bd56f6ee2ed68.rlib target/debug/deps/liburl-d627b16b64164b50.rlib target/debug/deps/libform_urlencoded-95861b6439c1abb6.rmeta target/debug/deps/percent_encoding-b82aaa83a3f1ece1.d target/debug/deps/unicode_bidi-d947e98f1314215b.d target/debug/deps/tinyvec_macros-25017543a519123f.d target/debug/deps/libunicode_bidi-d947e98f1314215b.rmeta target/debug/deps/libunicode_bidi-d947e98f1314215b.rlib target/debug/deps/libdata_url-d398adaa45d3869b.rlib target/debug/deps/libform_urlencoded-95861b6439c1abb6.rlib target/debug/deps/libpercent_encoding-b82aaa83a3f1ece1.rlib target/debug/deps/libtinyvec-a50bd56f6ee2ed68.rmeta target/debug/deps/libtinyvec_macros-25017543a519123f.rmeta target/debug/deps/libidna-726324058677286e.rmeta target/debug/deps/data_url-d398adaa45d3869b.d target/debug/deps/unicode_normalization-bbe37813a405e491.d target/debug/deps/libidna-726324058677286e.rlib target/debug/deps/liburl-d627b16b64164b50.rmeta target/debug/deps/libunicode_normalization-bbe37813a405e491.rlib target/debug/deps/libdata_url-d398adaa45d3869b.rmeta target/debug/deps/tinyvec-a50bd56f6ee2ed68.d target/debug/deps/libpercent_encoding-b82aaa83a3f1ece1.rmeta target/CACHEDIR.TAG target/debug/deps/libunicode_ident-3febed1ec838496d.rlib target/debug/deps/liblibc-ace0f0bbdcbf0373.rmeta target/debug/deps/proc_macro2-1eef835a9c881aa4.d target/debug/deps/libnum_cpus-b2a4ede6cfed6774.rmeta target/debug/deps/libunicode_ident-3febed1ec838496d.rmeta target/debug/deps/tester-9eb23c65da3afe94.d target/debug/deps/libaho_corasick-2e9dc80e9d7bfbbd.rlib target/debug/deps/libsyn-729eba90f722dded.rlib target/debug/deps/getopts-75a5cfb030da81b5.d target/debug/deps/anyhow-258208b6d6d01432.d target/debug/deps/data-7f47dce1bd8e2e0f.d target/debug/deps/libc-ace0f0bbdcbf0373.d target/debug/deps/serde_json-dc770969e002a827.d target/debug/deps/libanyhow-258208b6d6d01432.rmeta target/debug/deps/serde_core-b1dddf678d28d575.d target/debug/deps/term-218f25e3d530c86d.d target/debug/deps/tests-59cd81bff71ae601.d target/debug/deps/libserde_core-b1dddf678d28d575.rlib target/debug/deps/unit-a5735195d8f8601f target/debug/deps/unicode_ident-3febed1ec838496d.d target/debug/deps/libsyn-e03837b46b547978.rmeta target/debug/deps/debugger_test-0ad1fd381eb6ea52.d target/debug/deps/libquote-01f83d3eea7b6f2b.rlib target/debug/deps/regex-b4101d53f0aa179b.d target/debug/deps/assert_matches-997c872328890f4a.d target/debug/deps/regex_automata-64dbae0cf587aa72.d target/debug/deps/wpt-606068d5db7783da target/debug/deps/libitoa-07607aacafe8c110.rlib target/debug/deps/libanyhow-258208b6d6d01432.rlib target/debug/deps/libregex_automata-64dbae0cf587aa72.rlib target/debug/deps/libserde_json-dc770969e002a827.rmeta target/debug/deps/libserde_derive-966e8ca013c020f8.so target/debug/deps/libassert_matches-997c872328890f4a.rmeta target/debug/deps/data-7f47dce1bd8e2e0f target/debug/deps/libdebugger_test_parser-1e0be53005f01159.rmeta target/debug/deps/url-a827b1398b422d9c target/debug/deps/liblog-33dc065ff7e289ee.rlib target/debug/deps/libdirs_sys_next-a1b4df44aae05101.rmeta target/debug/deps/libserde-d508bb3ff3dd4055.rlib target/debug/deps/libserde_json-dc770969e002a827.rlib target/debug/deps/libassert_matches-997c872328890f4a.rlib target/debug/deps/libdebugger_test-0ad1fd381eb6ea52.so target/debug/deps/log-33dc065ff7e289ee.d target/debug/deps/libunicode_width-efcc0ccd9d13bff1.rlib target/debug/deps/libcfg_if-cfacf702a0ce2975.rlib target/debug/deps/wpt-606068d5db7783da.d target/debug/deps/debugger_test_parser-1e0be53005f01159.d target/debug/deps/libgetopts-75a5cfb030da81b5.rlib target/debug/deps/tests-59cd81bff71ae601 target/debug/deps/quote-01f83d3eea7b6f2b.d target/debug/deps/libregex-b4101d53f0aa179b.rmeta target/debug/deps/libproc_macro2-1eef835a9c881aa4.rlib target/debug/deps/libitoa-07607aacafe8c110.rmeta target/debug/deps/libregex_syntax-bd872110d85f2b72.rmeta target/debug/deps/idna-a04547c9c0564051.d target/debug/deps/unit-49bdfe7cb4758172 target/debug/deps/libzmij-5cc8b833226b94c4.rmeta target/debug/deps/percent_encoding-63ddf0be2a9952ea.d target/debug/deps/libaho_corasick-2e9dc80e9d7bfbbd.rmeta target/debug/deps/serde-d508bb3ff3dd4055.d target/debug/deps/liblibc-ace0f0bbdcbf0373.rlib target/debug/deps/libregex_automata-64dbae0cf587aa72.rmeta target/debug/deps/zmij-5cc8b833226b94c4.d target/debug/deps/libdirs_sys_next-a1b4df44aae05101.rlib target/debug/deps/url-a827b1398b422d9c.d target/debug/deps/libunicode_width-efcc0ccd9d13bff1.rmeta target/debug/deps/libdebugger_test_parser-1e0be53005f01159.rlib target/debug/deps/libmemchr-0e59f4b81d97fa7d.rlib target/debug/deps/serde_derive-966e8ca013c020f8.d target/debug/deps/libterm-218f25e3d530c86d.rmeta target/debug/deps/libterm-218f25e3d530c86d.rlib target/debug/deps/dirs_next-9f9ae5649cd83b0e.d target/debug/deps/bencher-99ba437b5f01bd5b.d target/debug/deps/libdirs_next-9f9ae5649cd83b0e.rmeta target/debug/deps/libcfg_if-cfacf702a0ce2975.rmeta target/debug/deps/libregex_syntax-bd872110d85f2b72.rlib target/debug/deps/libregex-b4101d53f0aa179b.rlib target/debug/deps/libmemchr-0e59f4b81d97fa7d.rmeta target/debug/deps/libproc_macro2-1eef835a9c881aa4.rmeta target/debug/deps/regex_syntax-bd872110d85f2b72.d target/debug/deps/cfg_if-cfacf702a0ce2975.d target/debug/deps/libbencher-99ba437b5f01bd5b.rmeta target/debug/deps/libserde_core-b1dddf678d28d575.rmeta target/debug/deps/itoa-07607aacafe8c110.d target/debug/deps/unit-a5735195d8f8601f.d target/debug/deps/libbencher-99ba437b5f01bd5b.rlib target/debug/deps/syn-e03837b46b547978.d target/debug/deps/libzmij-5cc8b833226b94c4.rlib target/debug/deps/unicode_width-efcc0ccd9d13bff1.d target/debug/deps/libsyn-729eba90f722dded.rmeta target/debug/deps/percent_encoding-63ddf0be2a9952ea target/debug/deps/aho_corasick-2e9dc80e9d7bfbbd.d target/debug/deps/memchr-0e59f4b81d97fa7d.d target/debug/deps/idna-a04547c9c0564051 target/debug/deps/libtester-9eb23c65da3afe94.rlib target/debug/deps/libquote-01f83d3eea7b6f2b.rmeta target/debug/deps/libgetopts-75a5cfb030da81b5.rmeta target/debug/deps/libtester-9eb23c65da3afe94.rmeta target/debug/deps/syn-729eba90f722dded.d target/debug/deps/libserde-d508bb3ff3dd4055.rmeta target/debug/deps/liblog-33dc065ff7e289ee.rmeta target/debug/deps/dirs_sys_next-a1b4df44aae05101.d target/debug/deps/num_cpus-b2a4ede6cfed6774.d
git status --short
Chunk ID: 60003e Wall time: 0.0000 seconds Process exited with code 128 Original token count: 18 Output: fatal: not a git repository (or any of the parent directories): .git
rg -n "struct Url|Position|path_start|before_path|AfterPort|BeforePath|path\(" url/src/lib.rs url/src/parser.rs url/src/slicing.rsChunk ID: a06d69
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 3696
Output:
url/src/lib.rs:28:use url::{Url, Host, Position};
url/src/lib.rs:42:assert!(issue_list_url.path() == "/rust-lang/rust/issues");
url/src/lib.rs:46:assert!(&issue_list_url[Position::BeforePath..] == "/rust-lang/rust/issues?labels=E-easy&state=open");
url/src/lib.rs:67:assert!(data_url.path() == "text/plain,Hello");
url/src/lib.rs:156:pub use crate::slicing::Position;
url/src/lib.rs:170:pub struct Url {
url/src/lib.rs:189: path_start: u32, // Before initial '/', if any
url/src/lib.rs:190: query_start: Option<u32>, // Before '?', unlike Position::QueryStart
url/src/lib.rs:191: fragment_start: Option<u32>, // Before '#', unlike Position::FragmentStart
url/src/lib.rs:326: fn strip_trailing_spaces_from_opaque_path(&mut self) {
url/src/lib.rs:457: let (base_path, base_filename) = extract_path_filename(self.path());
url/src/lib.rs:458: let (url_path, url_filename) = extract_path_filename(url.path());
url/src/lib.rs:665: if self.path_start == self.host_end {
url/src/lib.rs:669: let port_str = self.slice(self.host_end + 1..self.path_start);
url/src/lib.rs:676: self.path_start as usize == self.serialization.len()
url/src/lib.rs:677: || matches!(self.byte_at(self.path_start), b'/' | b'#' | b'?')
url/src/lib.rs:686: assert_eq!(self.path_start, self.scheme_end + 1);
url/src/lib.rs:689: assert!(start >= self.path_start);
url/src/lib.rs:693: assert!(start >= self.path_start);
url/src/lib.rs:713: assert_eq!(self.path_start, other.path_start);
url/src/lib.rs:882: if self.has_authority() && self.path_start > self.scheme_end + scheme_separator_len {
url/src/lib.rs:883: self.slice(self.scheme_end + scheme_separator_len..self.path_start)
url/src/lib.rs:1252: /// assert_eq!(url.path(), "/api/versions");
url/src/lib.rs:1255: /// assert_eq!(url.path(), "/");
url/src/lib.rs:1258: /// assert_eq!(url.path(), "/countries/vi%E1%BB%87t%20nam");
url/src/lib.rs:1263: pub fn path(&self) -> &str {
url/src/lib.rs:1265: (None, None) => self.slice(self.path_start..),
url/src/lib.rs:1267: self.slice(self.path_start..next_component_start)
url/src/lib.rs:1311: let path = self.path();
url/src/lib.rs:1464: self.strip_trailing_spaces_from_opaque_path();
url/src/lib.rs:1529: self.strip_trailing_spaces_from_opaque_path();
url/src/lib.rs:1587: fn take_after_path(&mut self) -> String {
url/src/lib.rs:1608: /// url.set_path("api/comments");
url/src/lib.rs:1610: /// assert_eq!(url.path(), "/api/comments");
url/src/lib.rs:1613: /// url.set_path("data/report.csv");
url/src/lib.rs:1615: /// assert_eq!(url.path(), "/data/report.csv");
url/src/lib.rs:1619: /// url.set_path("api/some comments");
url/src/lib.rs:1621: /// assert_eq!(url.path(), "/api/some%20comments");
url/src/lib.rs:1625: /// url.set_path("api/some%20comments");
url/src/lib.rs:1627: /// assert_eq!(url.path(), "/api/some%20comments");
url/src/lib.rs:1633: pub fn set_path(&mut self, mut path: &str) {
url/src/lib.rs:1634: let after_path = self.take_after_path();
url/src/lib.rs:1638: self.serialization.truncate(self.path_start as usize);
url/src/lib.rs:1645: parser.parse_cannot_be_a_base_path(parser::Input::new(path));
url/src/lib.rs:1648: parser.parse_path_start(scheme_type, &mut has_host, parser::Input::new(path));
url/src/lib.rs:1651: self.restore_after_path(old_after_path_pos, &after_path);
url/src/lib.rs:1666: fn restore_after_path(&mut self, old_after_path_position: u32, after_path: &str) {
url/src/lib.rs:1759: .drain(self.host_end as usize..self.path_start as usize);
url/src/lib.rs:1760: let offset = self.path_start - self.host_end;
url/src/lib.rs:1761: self.path_start = self.host_end;
url/src/lib.rs:1771: let path_and_after = self.slice(self.path_start..).to_owned();
url/src/lib.rs:1774: let old_path_start = self.path_start;
url/src/lib.rs:1775: let new_path_start = to_u32(self.serialization.len()).unwrap();
url/src/lib.rs:1776: self.path_start = new_path_start;
url/src/lib.rs:1778: *index -= old_path_start;
url/src/lib.rs:1779: *index += new_path_start;
url/src/lib.rs:1909: } else if self.serialization.len() == self.path_start as usize {
url/src/lib.rs:1913: debug_assert!(self.byte_at(self.path_start) == b'/');
url/src/lib.rs:1915: let new_path_start = if scheme_type.is_file() {
url/src/lib.rs:1922: .drain(new_path_start as usize..self.path_start as usize);
url/src/lib.rs:1923: let offset = self.path_start - new_path_start;
url/src/lib.rs:1924: self.path_start = new_path_start;
url/src/lib.rs:1925: self.username_end = new_path_start;
url/src/lib.rs:1926: self.host_start = new_path_start;
url/src/lib.rs:1927: self.host_end = new_path_start;
url/src/lib.rs:1942: self.path_start
url/src/lib.rs:1973: adjust(&mut self.path_start);
url/src/lib.rs:2081: adjust(&mut self.path_start);
url/src/lib.rs:2106: self.path_start -= offset;
url/src/lib.rs:2194: adjust(&mut self.path_start);
url/src/lib.rs:2345: adjust(&mut self.path_start);
url/src/lib.rs:2380: /// let url = Url::from_file_path("/tmp/foo.txt")?;
url/src/lib.rs:2383: /// let url = Url::from_file_path("../foo.txt");
url/src/lib.rs:2386: /// let url = Url::from_file_path("https://google.com/");
url/src/lib.rs:2407: path_start: host_end,
url/src/lib.rs:2423: /// * `"index.html"` parsed with `Url::from_directory_path(Path::new("/var/www"))`
url/src/lib.rs:2425: /// * `"index.html"` parsed with `Url::from_file_path(Path::new("/var/www"))`
url/src/lib.rs:2433: let mut url = Url::from_file_path(path)?;
url/src/lib.rs:2463: ref path_start,
url/src/lib.rs:2475: path_start,
url/src/lib.rs:2503: path_start,
url/src/lib.rs:2515: path_start,
url/src/lib.rs:2538: /// let path = url.to_file_path();
url/src/lib.rs:2549: pub fn to_file_path(&self) -> Result<PathBuf, ()> {
url/src/lib.rs:2625: .field("path", &self.path())
url/src/lib.rs:2727: struct UrlVisitor;
url/src/lib.rs:2892: "to_file_path() failed to produce an absolute Path"
url/src/lib.rs:2954: "to_file_path() failed to produce an absolute Path"
url/src/lib.rs:2961:pub struct UrlQuery<'a> {
url/src/parser.rs:470: let path_start = to_u32(self.serialization.len())?;
url/src/parser.rs:471: let username_end = path_start;
url/src/parser.rs:472: let host_start = path_start;
url/src/parser.rs:473: let host_end = path_start;
url/src/parser.rs:477: let path_start = self.serialization.len();
url/src/parser.rs:479: self.parse_path(scheme_type, &mut false, path_start, input)
url/src/parser.rs:481: self.parse_cannot_be_a_base_path(input)
url/src/parser.rs:491: path_start,
url/src/parser.rs:516: let (path_start, mut host, remaining) =
url/src/parser.rs:520: let remaining = if path_start {
url/src/parser.rs:521: self.parse_path_start(SchemeType::File, &mut has_host, remaining)
url/src/parser.rs:523: let path_start = self.serialization.len();
url/src/parser.rs:525: self.parse_path(SchemeType::File, &mut has_host, path_start, remaining)
url/src/parser.rs:546: path_start: host_end,
url/src/parser.rs:581: self.parse_path(SchemeType::File, &mut false, host_end, parse_path_input);
url/src/parser.rs:597: path_start: host_end,
url/src/parser.rs:642: self.shorten_path(SchemeType::File, base_url.path_start as usize);
url/src/parser.rs:643: let remaining = self.parse_path(
url/src/parser.rs:646: base_url.path_start as usize,
url/src/parser.rs:657: base_url.path_start,
url/src/parser.rs:663: let path_start = "file://".len();
url/src/parser.rs:665: self.parse_path(SchemeType::File, &mut false, path_start, input);
url/src/parser.rs:668: let path_start = path_start as u32;
url/src/parser.rs:672: username_end: path_start,
url/src/parser.rs:673: host_start: path_start,
url/src/parser.rs:674: host_end: path_start,
url/src/parser.rs:677: path_start,
url/src/parser.rs:687: let path_start = "file://".len();
url/src/parser.rs:688: let remaining = self.parse_path(SchemeType::File, &mut false, path_start, input);
url/src/parser.rs:691: let path_start = path_start as u32;
url/src/parser.rs:695: username_end: path_start,
url/src/parser.rs:696: host_start: path_start,
url/src/parser.rs:697: host_end: path_start,
url/src/parser.rs:700: path_start,
url/src/parser.rs:766: let path_start = base_url.path_start;
url/src/parser.rs:767: self.serialization.push_str(base_url.slice(..path_start));
url/src/parser.rs:769: let remaining = self.parse_path(
url/src/parser.rs:772: path_start as usize,
url/src/parser.rs:783: base_url.path_start,
url/src/parser.rs:794: self.pop_path(scheme_type, base_url.path_start as usize);
url/src/parser.rs:797: if self.serialization.len() == base_url.path_start as usize
url/src/parser.rs:803: (Some('/'), remaining) => self.parse_path(
url/src/parser.rs:806: base_url.path_start as usize,
url/src/parser.rs:810: self.parse_path(scheme_type, &mut true, base_url.path_start as usize, input)
url/src/parser.rs:821: base_url.path_start,
url/src/parser.rs:848: let path_start = to_u32(self.serialization.len())?;
url/src/parser.rs:849: let remaining = self.parse_path_start(scheme_type, &mut true, remaining);
url/src/parser.rs:858: path_start,
url/src/parser.rs:1127: pub fn parse_path_start<'i>(
url/src/parser.rs:1133: let path_start = self.serialization.len();
url/src/parser.rs:1146: return self.parse_path(scheme_type, has_host, path_start, remaining);
url/src/parser.rs:1149: return self.parse_path(scheme_type, has_host, path_start, input);
url/src/parser.rs:1163: self.parse_path(scheme_type, has_host, path_start, input)
url/src/parser.rs:1170: path_start: usize,
url/src/parser.rs:1230: && Parser::last_slash_can_be_removed(&self.serialization, path_start)
url/src/parser.rs:1234: self.shorten_path(scheme_type, path_start);
url/src/parser.rs:1279: let path = self.serialization.split_off(path_start);
url/src/parser.rs:1287: fn last_slash_can_be_removed(serialization: &str, path_start: usize) -> bool {
url/src/parser.rs:1291: segment_before_start >= path_start
url/src/parser.rs:1293: && !path_starts_with_windows_drive_letter(&serialization[segment_before_start..])
url/src/parser.rs:1300: fn shorten_path(&mut self, scheme_type: SchemeType, path_start: usize) {
url/src/parser.rs:1302: if self.serialization.len() == path_start {
url/src/parser.rs:1307: && is_normalized_windows_drive_letter(&self.serialization[path_start..])
url/src/parser.rs:1312: self.pop_path(scheme_type, path_start);
url/src/parser.rs:1316: fn pop_path(&mut self, scheme_type: SchemeType, path_start: usize) {
url/src/parser.rs:1317: if self.serialization.len() > path_start {
url/src/parser.rs:1318: let slash_position = self.serialization[path_start..].rfind('/').unwrap();
url/src/parser.rs:1320: let segment_start = path_start + slash_position + 1;
url/src/parser.rs:1357: path_start: u32,
url/src/parser.rs:1370: path_start,
url/src/parser.rs:1562:fn path_starts_with_windows_drive_letter(s: &str) -> bool {
url/src/slicing.rs:19:impl Index<RangeFrom<Position>> for Url {
url/src/slicing.rs:21: fn index(&self, range: RangeFrom<Position>) -> &str {
url/src/slicing.rs:26:impl Index<RangeTo<Position>> for Url {
url/src/slicing.rs:28: fn index(&self, range: RangeTo<Position>) -> &str {
url/src/slicing.rs:33:impl Index<Range<Position>> for Url {
url/src/slicing.rs:35: fn index(&self, range: Range<Position>) -> &str {
url/src/slicing.rs:45:/// # use url::{Url, Position};
url/src/slicing.rs:48:/// let serialization_without_fragment: &str = &some_url[..Position::AfterQuery];
url/src/slicing.rs:49:/// let authority: &str = &some_url[Position::BeforeUsername..Position::AfterPort];
url/src/slicing.rs:50:/// let data_url_payload: &str = &some_url[Position::BeforePath..Position::AfterQuery];
url/src/slicing.rs:51:/// let scheme_relative: &str = &some_url[Position::BeforeUsername..];
url/src/slicing.rs:81:pub enum Position {
url/src/slicing.rs:91: AfterPort,
url/src/slicing.rs:92: BeforePath,
url/src/slicing.rs:102: fn index(&self, position: Position) -> usize {
url/src/slicing.rs:104: Position::BeforeScheme => 0,
url/src/slicing.rs:106: Position::AfterScheme => self.scheme_end as usize,
url/src/slicing.rs:108: Position::BeforeUsername => {
url/src/slicing.rs:118: Position::AfterUsername => self.username_end as usize,
url/src/slicing.rs:120: Position::BeforePassword => {
url/src/slicing.rs:129: Position::AfterPassword => {
url/src/slicing.rs:139: Position::BeforeHost => self.host_start as usize,
url/src/slicing.rs:141: Position::AfterHost => self.host_end as usize,
url/src/slicing.rs:143: Position::BeforePort => {
url/src/slicing.rs:152: Position::AfterPort => self.path_start as usize,
url/src/slicing.rs:154: Position::BeforePath => self.path_start as usize,
url/src/slicing.rs:156: Position::AfterPath => match (self.query_start, self.fragment_start) {
url/src/slicing.rs:162: Position::BeforeQuery => match (self.query_start, self.fragment_start) {
url/src/slicing.rs:171: Position::AfterQuery => match self.fragment_start {
url/src/slicing.rs:176: Position::BeforeFragment => match self.fragment_start {
url/src/slicing.rs:184: Position::AfterFragment => self.serialization.len(),
rg -n "relative|join|dot|segment|cannot_be_a_base|non-special|special|NonRelative" url/src/parser.rs url/src/lib.rs url/src/slicing.rs
Chunk ID: 31bf8c
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 3677
Output:
url/src/parser.rs:39:// The backslash (\) character is treated as a path separator in special URLs
url/src/parser.rs:84: RelativeUrlWithoutBase => "relative URL without a base",
url/src/parser.rs:85: RelativeUrlWithCannotBeABaseBase => "relative URL with a cannot-be-a-base base",
url/src/parser.rs:153: pub fn is_special(&self) -> bool {
url/src/parser.rs:372: } else if base_url.cannot_be_a_base() {
url/src/parser.rs:379: self.parse_relative(input, scheme_type, base_url)
url/src/parser.rs:432: // special relative or authority state
url/src/parser.rs:438: // "Cannot-be-a-base" URLs only happen with "not special" schemes.
url/src/parser.rs:439: debug_assert!(!base_url.cannot_be_a_base());
url/src/parser.rs:441: return self.parse_relative(input, scheme_type, base_url);
url/src/parser.rs:444: // special authority slashes state
url/src/parser.rs:454: SchemeType::NotSpecial => self.parse_non_special(input, scheme_type, scheme_end),
url/src/parser.rs:459: fn parse_non_special(
url/src/parser.rs:481: self.parse_cannot_be_a_base_path(input)
url/src/parser.rs:556: if !starts_with_windows_drive_letter_segment(&input_after_first_char) {
url/src/parser.rs:558: let first_segment = base_url.path_segments().unwrap().next().unwrap();
url/src/parser.rs:559: if is_normalized_windows_drive_letter(first_segment) {
url/src/parser.rs:561: self.serialization.push_str(first_segment);
url/src/parser.rs:636: if !starts_with_windows_drive_letter_segment(&input) {
url/src/parser.rs:707: fn parse_relative(
url/src/parser.rs:713: // relative state
url/src/parser.rs:795: // A special url always has a path.
url/src/parser.rs:798: && (SchemeType::from(base_url.scheme()).is_special() || !input.is_empty())
url/src/parser.rs:883: '\\' if scheme_type.is_special() => break,
url/src/parser.rs:893: // url is special and c is U+005C (\)
url/src/parser.rs:896: if c == '/' || c == '?' || c == '#' || (scheme_type.is_special() && c == '\\') {
url/src/parser.rs:953: if scheme_type.is_special() {
url/src/parser.rs:988: '\\' if scheme_type.is_special() => break,
url/src/parser.rs:1020: if !scheme_type.is_special() {
url/src/parser.rs:1135: // If url is special, then:
url/src/parser.rs:1136: if scheme_type.is_special() {
url/src/parser.rs:1141: // A special URL always has a non-empty path.
url/src/parser.rs:1175: let segment_start = self.serialization.len();
url/src/parser.rs:1191: && scheme_type.is_special() =>
url/src/parser.rs:1205: if scheme_type.is_special() {
url/src/parser.rs:1218: let segment_before_slash = if ends_with_slash {
url/src/parser.rs:1219: &self.serialization[segment_start..self.serialization.len() - 1]
url/src/parser.rs:1221: &self.serialization[segment_start..self.serialization.len()]
url/src/parser.rs:1223: match segment_before_slash {
url/src/parser.rs:1224: // If buffer is a double-dot path segment, shorten url’s path,
url/src/parser.rs:1227: debug_assert!(self.serialization.as_bytes()[segment_start - 1] == b'/');
url/src/parser.rs:1228: self.serialization.truncate(segment_start);
url/src/parser.rs:1236: // and then if neither c is U+002F (/), nor url is special and c is U+005C (\), append the empty string to url’s path.
url/src/parser.rs:1241: // Otherwise, if buffer is a single-dot path segment and if neither c is U+002F (/),
url/src/parser.rs:1242: // nor url is special and c is U+005C (\), append the empty string to url’s path.
url/src/parser.rs:1244: self.serialization.truncate(segment_start);
url/src/parser.rs:1251: if scheme_type.is_file() && is_windows_drive_letter(segment_before_slash) {
url/src/parser.rs:1253: if let Some(c) = segment_before_slash.chars().next() {
url/src/parser.rs:1254: self.serialization.truncate(segment_start);
url/src/parser.rs:1288: let url_before_segment = &serialization[..serialization.len() - 1];
url/src/parser.rs:1289: if let Some(segment_before_start) = url_before_segment.rfind('/') {
url/src/parser.rs:1291: segment_before_start >= path_start
url/src/parser.rs:1293: && !path_starts_with_windows_drive_letter(&serialization[segment_before_start..])
url/src/parser.rs:1320: let segment_start = path_start + slash_position + 1;
url/src/parser.rs:1323: && is_normalized_windows_drive_letter(&self.serialization[segment_start..]))
url/src/parser.rs:1325: self.serialization.truncate(segment_start);
url/src/parser.rs:1330: pub fn parse_cannot_be_a_base_path<'i>(&mut self, mut input: Input<'i>) -> Input<'i> {
url/src/parser.rs:1434: let set = if scheme_type.is_special() {
url/src/parser.rs:1549:fn is_normalized_windows_drive_letter(segment: &str) -> bool {
url/src/parser.rs:1550: is_windows_drive_letter(segment) && segment.as_bytes()[1] == b':'
url/src/parser.rs:1553:/// Whether the scheme is file:, the path has a single segment, and that segment
url/src/parser.rs:1556:pub fn is_windows_drive_letter(segment: &str) -> bool {
url/src/parser.rs:1557: segment.len() == 2 && starts_with_windows_drive_letter(segment)
url/src/parser.rs:1578:fn starts_with_windows_drive_letter_segment(input: &Input<'_>) -> bool {
url/src/slicing.rs:51:/// let scheme_relative: &str = &some_url[Position::BeforeUsername..];
url/src/lib.rs:43:assert!(issue_list_url.path_segments().map(|c| c.collect::<Vec<_>>()) ==
url/src/lib.rs:48:assert!(!issue_list_url.cannot_be_a_base());
url/src/lib.rs:56:and their "path" is an arbitrary string rather than slash-separated segments:
url/src/lib.rs:65:assert!(data_url.cannot_be_a_base());
url/src/lib.rs:68:assert!(data_url.path_segments().is_none());
url/src/lib.rs:82:Many contexts allow URL *references* that can be relative to a *base URL*:
url/src/lib.rs:88:Since parsed URLs are absolute, giving a base is required for parsing relative URLs:
url/src/lib.rs:96:Use the `join` method on an `Url` to use it as a base URL:
url/src/lib.rs:104:let css_url = this_document.join("../main.css")?;
url/src/lib.rs:155:pub use crate::path_segments::PathSegmentsMut;
url/src/lib.rs:162:mod path_segments;
url/src/lib.rs:179: /// hierarchical-path = [ "/" path-segment ]+
url/src/lib.rs:327: if !self.cannot_be_a_base() {
url/src/lib.rs:353: /// The inverse of this is [`make_relative`].
url/src/lib.rs:367: /// let url = base.join("c.png")?;
url/src/lib.rs:371: /// let url = base.join("c.png")?;
url/src/lib.rs:384: /// [`make_relative`]: #method.make_relative
url/src/lib.rs:386: pub fn join(&self, input: &str) -> Result<Url, crate::ParseError> {
url/src/lib.rs:390: /// Creates a relative URL if possible, with this URL as the base URL.
url/src/lib.rs:392: /// This is the inverse of [`join`].
url/src/lib.rs:403: /// let relative = base.make_relative(&url);
url/src/lib.rs:404: /// assert_eq!(relative.as_ref().map(|s| s.as_str()), Some("c.png"));
url/src/lib.rs:408: /// let relative = base.make_relative(&url);
url/src/lib.rs:409: /// assert_eq!(relative.as_ref().map(|s| s.as_str()), Some("c.png"));
url/src/lib.rs:413: /// let relative = base.make_relative(&url);
url/src/lib.rs:414: /// assert_eq!(relative.as_ref().map(|s| s.as_str()), Some("../d/c.png"));
url/src/lib.rs:418: /// let relative = base.make_relative(&url);
url/src/lib.rs:419: /// assert_eq!(relative.as_ref().map(|s| s.as_str()), Some("?e=f"));
url/src/lib.rs:430: /// [`join`]: #method.join
url/src/lib.rs:431: pub fn make_relative(&self, url: &Url) -> Option<String> {
url/src/lib.rs:432: if self.cannot_be_a_base() {
url/src/lib.rs:444: let mut relative = String::new();
url/src/lib.rs:469: // Add `..` segments for the remainder of the base path
url/src/lib.rs:470: for base_path_segment in base_path {
url/src/lib.rs:471: // Skip empty last segments
url/src/lib.rs:472: if base_path_segment.is_empty() {
url/src/lib.rs:476: if !relative.is_empty() {
url/src/lib.rs:477: relative.push('/');
url/src/lib.rs:480: relative.push_str("..");
url/src/lib.rs:484: for url_path_segment in url_path {
url/src/lib.rs:485: if !relative.is_empty() {
url/src/lib.rs:486: relative.push('/');
url/src/lib.rs:489: relative.push_str(url_path_segment);
url/src/lib.rs:493: if !relative.is_empty() || base_filename != url_filename {
url/src/lib.rs:499: relative.push('/');
url/src/lib.rs:501: if !relative.is_empty() {
url/src/lib.rs:502: relative.push('/');
url/src/lib.rs:504: relative.push_str(url_filename);
url/src/lib.rs:510: relative.push('?');
url/src/lib.rs:511: relative.push_str(query);
url/src/lib.rs:515: relative.push('#');
url/src/lib.rs:516: relative.push_str(fragment);
url/src/lib.rs:519: Some(relative)
url/src/lib.rs:660: if SchemeType::from(self.scheme()).is_special() {
url/src/lib.rs:851: /// of a special URL, or percent encoded for non-special URLs.
url/src/lib.rs:853: /// Ports are omitted if they match the well known port of a special URL.
url/src/lib.rs:890: /// meaning that parsing a relative URL string with this URL as the base will return an error.
url/src/lib.rs:903: /// assert!(!url.cannot_be_a_base());
url/src/lib.rs:906: /// assert!(!url.cannot_be_a_base());
url/src/lib.rs:909: /// assert!(url.cannot_be_a_base());
url/src/lib.rs:915: pub fn cannot_be_a_base(&self) -> bool {
url/src/lib.rs:1016: /// of a special URL, or percent encoded for non-special URLs.
url/src/lib.rs:1056: /// of a special URL, or percent encoded for non-special URLs.
url/src/lib.rs:1096: /// of a special URL, or percent encoded for non-special URLs.
url/src/lib.rs:1243: /// and continues with slash-separated path segments.
url/src/lib.rs:1273: /// return an iterator of '/' slash-separated path segments,
url/src/lib.rs:1289: /// let mut path_segments = url.path_segments().ok_or_else(|| "cannot be base")?;
url/src/lib.rs:1290: /// assert_eq!(path_segments.next(), Some("foo"));
url/src/lib.rs:1291: /// assert_eq!(path_segments.next(), Some("bar"));
url/src/lib.rs:1292: /// assert_eq!(path_segments.next(), None);
url/src/lib.rs:1295: /// let mut path_segments = url.path_segments().ok_or_else(|| "cannot be base")?;
url/src/lib.rs:1296: /// assert_eq!(path_segments.next(), Some(""));
url/src/lib.rs:1297: /// assert_eq!(path_segments.next(), None);
url/src/lib.rs:1300: /// assert!(url.path_segments().is_none());
url/src/lib.rs:1303: /// let mut path_segments = url.path_segments().ok_or_else(|| "cannot be base")?;
url/src/lib.rs:1304: /// assert_eq!(path_segments.next(), Some("countries"));
url/src/lib.rs:1305: /// assert_eq!(path_segments.next(), Some("vi%E1%BB%87t%20nam"));
url/src/lib.rs:1310: pub fn path_segments(&self) -> Option<str::Split<'_, char>> {
url/src/lib.rs:1636: let cannot_be_a_base = self.cannot_be_a_base();
url/src/lib.rs:1640: if cannot_be_a_base {
url/src/lib.rs:1645: parser.parse_cannot_be_a_base_path(parser::Input::new(path));
url/src/lib.rs:1654: /// Return an object with methods to manipulate this URL’s path segments.
url/src/lib.rs:1658: pub fn path_segments_mut(&mut self) -> Result<PathSegmentsMut<'_>, ()> {
url/src/lib.rs:1659: if self.cannot_be_a_base() {
url/src/lib.rs:1662: Ok(path_segments::new(self))
url/src/lib.rs:1743: // has_host implies !cannot_be_a_base
url/src/lib.rs:1832: /// Cannot remove host for 'special' schemes (e.g. `http`):
url/src/lib.rs:1876: if self.cannot_be_a_base() {
url/src/lib.rs:1883: if host.is_empty() && scheme_type.is_special() && !scheme_type.is_file() {
url/src/lib.rs:1901: if SchemeType::from(self.scheme()).is_special() {
url/src/lib.rs:1907: if scheme_type.is_special() && !scheme_type.is_file() {
url/src/lib.rs:2021: if self.cannot_be_a_base() {
url/src/lib.rs:2061: // has_host implies !cannot_be_a_base
url/src/lib.rs:2154: // has_host implies !cannot_be_a_base
url/src/lib.rs:2320: // If url’s scheme is a special scheme and buffer is not a special scheme, then return.
url/src/lib.rs:2321: if (new_scheme_type.is_special() && !old_scheme_type.is_special()) ||
url/src/lib.rs:2322: // If url’s scheme is not a special scheme and buffer is a special scheme, then return.
url/src/lib.rs:2323: (!new_scheme_type.is_special() && old_scheme_type.is_special()) ||
url/src/lib.rs:2331: if !remaining.is_empty() || (!self.has_host() && new_scheme_type.is_special()) {
url/src/lib.rs:2398: let (host_end, host) = path_to_file_url_segments(path.as_ref(), &mut serialization)?;
url/src/lib.rs:2550: if let Some(segments) = self.path_segments() {
url/src/lib.rs:2559: return file_url_segments_to_pathbuf(host, segments);
url/src/lib.rs:2620: .field("cannot_be_a_base", &self.cannot_be_a_base())
url/src/lib.rs:2752:fn path_to_file_url_segments(
url/src/lib.rs:2782:fn path_to_file_url_segments(
url/src/lib.rs:2786: path_to_file_url_segments_windows(path, serialization)
url/src/lib.rs:2791:fn path_to_file_url_segments_windows(
url/src/lib.rs:2854:fn file_url_segments_to_pathbuf(
url/src/lib.rs:2856: segments: str::Split<'_, char>,
url/src/lib.rs:2874: for segment in segments {
url/src/lib.rs:2876: bytes.extend(percent_decode(segment.as_bytes()));
url/src/lib.rs:2899:fn file_url_segments_to_pathbuf(
url/src/lib.rs:2901: segments: str::Split<char>,
url/src/lib.rs:2903: file_url_segments_to_pathbuf_windows(host, segments)
url/src/lib.rs:2908:fn file_url_segments_to_pathbuf_windows(
url/src/lib.rs:2910: mut segments: str::Split<'_, char>,
url/src/lib.rs:2915: let first = segments.next().ok_or(())?;
url/src/lib.rs:2942: for segment in segments {
url/src/lib.rs:2946: match String::from_utf8(percent_decode(segment.as_bytes()).collect()) {
rg -n "fn .*serialize|impl Display|serialization|as_str|String" url/src/lib.rs url/src/parser.rs url/src/slicing.rs
Chunk ID: f9ddd9
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 6752
Output:
url/src/parser.rs:272: let utf8 = self.chars.as_str();
url/src/parser.rs:322: pub serialization: String,
url/src/parser.rs:351: pub fn for_setter(serialization: String) -> Parser<'a> {
url/src/parser.rs:353: serialization,
url/src/parser.rs:391: debug_assert!(self.serialization.is_empty());
url/src/parser.rs:395: self.serialization.push(c.to_ascii_lowercase())
url/src/parser.rs:399: self.serialization.clear();
url/src/parser.rs:408: self.serialization.clear();
url/src/parser.rs:415: let scheme_end = to_u32(self.serialization.len())?;
url/src/parser.rs:416: let scheme_type = SchemeType::from(&self.serialization);
url/src/parser.rs:417: self.serialization.push(':');
url/src/parser.rs:428: self.serialization.clear();
url/src/parser.rs:436: && base_url.scheme() == &self.serialization[..scheme_end as usize]
url/src/parser.rs:440: self.serialization.clear();
url/src/parser.rs:449: .collect::<String>()
url/src/parser.rs:470: let path_start = to_u32(self.serialization.len())?;
url/src/parser.rs:477: let path_start = self.serialization.len();
url/src/parser.rs:478: self.serialization.push('/');
url/src/parser.rs:504: debug_assert!(self.serialization.is_empty());
url/src/parser.rs:513: self.serialization.push_str("file://");
url/src/parser.rs:518: let mut host_end = to_u32(self.serialization.len())?;
url/src/parser.rs:523: let path_start = self.serialization.len();
url/src/parser.rs:524: self.serialization.push('/');
url/src/parser.rs:531: self.serialization
url/src/parser.rs:539: serialization: self.serialization,
url/src/parser.rs:551: self.serialization.push_str("file://");
url/src/parser.rs:560: self.serialization.push('/');
url/src/parser.rs:561: self.serialization.push_str(first_segment);
url/src/parser.rs:563: self.serialization.push_str(host_str);
url/src/parser.rs:564: host_end = self.serialization.len();
url/src/parser.rs:590: serialization: self.serialization,
url/src/parser.rs:608: Some(i) => &base_url.serialization[..i as usize],
url/src/parser.rs:609: None => &*base_url.serialization,
url/src/parser.rs:611: self.serialization.push_str(before_fragment);
url/src/parser.rs:613: serialization: self.serialization,
url/src/parser.rs:621: (None, None) => &*base_url.serialization,
url/src/parser.rs:624: self.serialization.push_str(before_query);
url/src/parser.rs:628: serialization: self.serialization,
url/src/parser.rs:638: (None, None) => &*base_url.serialization,
url/src/parser.rs:641: self.serialization.push_str(before_query);
url/src/parser.rs:661: self.serialization.push_str("file:///");
url/src/parser.rs:670: serialization: self.serialization,
url/src/parser.rs:685: self.serialization.push_str("file:///");
url/src/parser.rs:693: serialization: self.serialization,
url/src/parser.rs:714: debug_assert!(self.serialization.is_empty());
url/src/parser.rs:720: Some(i) => &base_url.serialization[..i as usize],
url/src/parser.rs:721: None => &*base_url.serialization,
url/src/parser.rs:723: self.serialization.push_str(before_fragment);
url/src/parser.rs:725: serialization: self.serialization,
url/src/parser.rs:733: (None, None) => &*base_url.serialization,
url/src/parser.rs:736: self.serialization.push_str(before_query);
url/src/parser.rs:740: serialization: self.serialization,
url/src/parser.rs:754: .collect::<String>()
url/src/parser.rs:759: self.serialization
url/src/parser.rs:767: self.serialization.push_str(base_url.slice(..path_start));
url/src/parser.rs:768: self.serialization.push('/');
url/src/parser.rs:789: (None, None) => &*base_url.serialization,
url/src/parser.rs:792: self.serialization.push_str(before_query);
url/src/parser.rs:797: if self.serialization.len() == base_url.path_start as usize
url/src/parser.rs:800: self.serialization.push('/');
url/src/parser.rs:834: self.serialization.push('/');
url/src/parser.rs:835: self.serialization.push('/');
url/src/parser.rs:837: let before_authority = self.serialization.len();
url/src/parser.rs:839: let has_authority = before_authority != self.serialization.len();
url/src/parser.rs:841: let host_start = to_u32(self.serialization.len())?;
url/src/parser.rs:848: let path_start = to_u32(self.serialization.len())?;
url/src/parser.rs:889: None => return Ok((to_u32(self.serialization.len())?, input)),
url/src/parser.rs:900: return Ok((to_u32(self.serialization.len())?, remaining));
url/src/parser.rs:913: username_end = Some(to_u32(self.serialization.len())?);
url/src/parser.rs:916: self.serialization.push(':');
url/src/parser.rs:924: self.serialization
url/src/parser.rs:930: None => to_u32(self.serialization.len())?,
url/src/parser.rs:933: self.serialization.push('@');
url/src/parser.rs:945: write!(&mut self.serialization, "{}", host).unwrap();
url/src/parser.rs:946: let host_end = to_u32(self.serialization.len())?;
url/src/parser.rs:960: let scheme = || default_port(&self.serialization[..scheme_end as usize]);
url/src/parser.rs:966: write!(&mut self.serialization, ":{}", port).unwrap()
url/src/parser.rs:974: ) -> ParseResult<(Host<String>, Input<'_>)> {
url/src/parser.rs:980: let input_str = input.chars.as_str();
url/src/parser.rs:1005: let replaced: String;
url/src/parser.rs:1028: fn get_file_host(input: Input<'_>) -> ParseResult<(Host<String>, Input<'_>)> {
url/src/parser.rs:1053: write!(&mut self.serialization, "{}", host).unwrap();
url/src/parser.rs:1062: pub fn file_host(input: Input) -> ParseResult<(bool, String, Input)> {
url/src/parser.rs:1065: let input_str = input.chars.as_str();
url/src/parser.rs:1077: let replaced: String;
url/src/parser.rs:1133: let path_start = self.serialization.len();
url/src/parser.rs:1142: if !self.serialization.ends_with('/') {
url/src/parser.rs:1143: self.serialization.push('/');
url/src/parser.rs:1160: self.serialization.push('/');
url/src/parser.rs:1175: let segment_start = self.serialization.len();
url/src/parser.rs:1186: self.serialization.push(c);
url/src/parser.rs:1194: self.serialization.push('/');
url/src/parser.rs:1206: self.serialization
url/src/parser.rs:1209: self.serialization
url/src/parser.rs:1213: self.serialization.extend(utf8_percent_encode(utf8_c, PATH));
url/src/parser.rs:1219: &self.serialization[segment_start..self.serialization.len() - 1]
url/src/parser.rs:1221: &self.serialization[segment_start..self.serialization.len()]
url/src/parser.rs:1227: debug_assert!(self.serialization.as_bytes()[segment_start - 1] == b'/');
url/src/parser.rs:1228: self.serialization.truncate(segment_start);
url/src/parser.rs:1229: if self.serialization.ends_with('/')
url/src/parser.rs:1230: && Parser::last_slash_can_be_removed(&self.serialization, path_start)
url/src/parser.rs:1232: self.serialization.pop();
url/src/parser.rs:1237: if ends_with_slash && !self.serialization.ends_with('/') {
url/src/parser.rs:1238: self.serialization.push('/');
url/src/parser.rs:1244: self.serialization.truncate(segment_start);
url/src/parser.rs:1245: if !self.serialization.ends_with('/') {
url/src/parser.rs:1246: self.serialization.push('/');
url/src/parser.rs:1254: self.serialization.truncate(segment_start);
url/src/parser.rs:1255: self.serialization.push(c);
url/src/parser.rs:1256: self.serialization.push(':');
url/src/parser.rs:1258: self.serialization.push('/');
url/src/parser.rs:1279: let path = self.serialization.split_off(path_start);
url/src/parser.rs:1280: self.serialization.push('/');
url/src/parser.rs:1281: self.serialization.push_str(path.trim_start_matches('/'));
url/src/parser.rs:1287: fn last_slash_can_be_removed(serialization: &str, path_start: usize) -> bool {
url/src/parser.rs:1288: let url_before_segment = &serialization[..serialization.len() - 1];
url/src/parser.rs:1293: && !path_starts_with_windows_drive_letter(&serialization[segment_before_start..])
url/src/parser.rs:1302: if self.serialization.len() == path_start {
url/src/parser.rs:1307: && is_normalized_windows_drive_letter(&self.serialization[path_start..])
url/src/parser.rs:1317: if self.serialization.len() > path_start {
url/src/parser.rs:1318: let slash_position = self.serialization[path_start..].rfind('/').unwrap();
url/src/parser.rs:1323: && is_normalized_windows_drive_letter(&self.serialization[segment_start..]))
url/src/parser.rs:1325: self.serialization.truncate(segment_start);
url/src/parser.rs:1339: self.serialization
url/src/parser.rs:1363: serialization: self.serialization,
url/src/parser.rs:1387: query_start = Some(to_u32(self.serialization.len())?);
url/src/parser.rs:1388: self.serialization.push('?');
url/src/parser.rs:1400: let fragment_start = to_u32(self.serialization.len())?;
url/src/parser.rs:1401: self.serialization.push('#');
url/src/parser.rs:1412: let len = input.chars.as_str().len();
url/src/parser.rs:1413: let mut query = String::with_capacity(len); // FIXME: use a streaming decoder instead
url/src/parser.rs:1425: let encoding = match &self.serialization[..scheme_end as usize] {
url/src/parser.rs:1439: self.serialization.extend(percent_encode(&query_bytes, set));
url/src/parser.rs:1446: None => &*base_url.serialization,
url/src/parser.rs:1448: debug_assert!(self.serialization.is_empty());
url/src/parser.rs:1449: self.serialization
url/src/parser.rs:1450: .reserve(before_fragment.len() + input.chars.as_str().len());
url/src/parser.rs:1451: self.serialization.push_str(before_fragment);
url/src/parser.rs:1452: self.serialization.push('#');
url/src/parser.rs:1457: serialization: self.serialization,
url/src/parser.rs:1470: self.serialization
url/src/slicing.rs:15: &self.serialization
url/src/slicing.rs:22: &self.serialization[self.index(range.start)..]
url/src/slicing.rs:29: &self.serialization[..self.index(range.end)]
url/src/slicing.rs:36: &self.serialization[self.index(range.start)..self.index(range.end)]
url/src/slicing.rs:47:/// let serialization: &str = &some_url[..];
url/src/slicing.rs:48:/// let serialization_without_fragment: &str = &some_url[..Position::AfterQuery];
url/src/slicing.rs:159: (None, None) => self.serialization.len(),
url/src/slicing.rs:168: (None, None) => self.serialization.len(),
url/src/slicing.rs:172: None => self.serialization.len(),
url/src/slicing.rs:181: None => self.serialization.len(),
url/src/slicing.rs:184: Position::AfterFragment => self.serialization.len(),
url/src/lib.rs:105:assert_eq!(css_url.as_str(), "http://servo.[code-host]/rust-url/main.css");
url/src/lib.rs:180: serialization: String,
url/src/lib.rs:231: /// assert_eq!(url.as_str(), "https://example.com/");
url/src/lib.rs:246: serialization: String::with_capacity(input.len()),
url/src/lib.rs:296: /// assert_eq!("https://example.net/?dont=clobberme&lang=rust&browser=servo", url.as_str());
url/src/lib.rs:340: .serialization
url/src/lib.rs:346: let start = self.serialization.len() - trailing_space_count;
url/src/lib.rs:348: self.serialization.truncate(start);
url/src/lib.rs:368: /// assert_eq!(url.as_str(), "https://example.net/a/c.png"); // Not /a/b.html/c.png
url/src/lib.rs:372: /// assert_eq!(url.as_str(), "https://example.net/a/b/c.png");
url/src/lib.rs:404: /// assert_eq!(relative.as_ref().map(|s| s.as_str()), Some("c.png"));
url/src/lib.rs:409: /// assert_eq!(relative.as_ref().map(|s| s.as_str()), Some("c.png"));
url/src/lib.rs:414: /// assert_eq!(relative.as_ref().map(|s| s.as_str()), Some("../d/c.png"));
url/src/lib.rs:419: /// assert_eq!(relative.as_ref().map(|s| s.as_str()), Some("?e=f"));
url/src/lib.rs:431: pub fn make_relative(&self, url: &Url) -> Option<String> {
url/src/lib.rs:444: let mut relative = String::new();
url/src/lib.rs:536: /// assert_eq!(version_url.as_str(), "https://api.example.com/version.json");
url/src/lib.rs:549: /// Return the serialization of this URL.
url/src/lib.rs:551: /// This is fast since that serialization is already stored in the `Url` struct.
url/src/lib.rs:562: /// assert_eq!(url.as_str(), url_str);
url/src/lib.rs:568: pub fn as_str(&self) -> &str {
url/src/lib.rs:569: &self.serialization
url/src/lib.rs:572: /// Return the serialization of this URL.
url/src/lib.rs:574: /// This consumes the `Url` and takes ownership of the `String` stored in it.
url/src/lib.rs:585: /// assert_eq!(String::from(url), url_str);
url/src/lib.rs:591: #[deprecated(since = "2.3.0", note = "use Into<String>")]
url/src/lib.rs:592: pub fn into_string(self) -> String {
url/src/lib.rs:602: pub fn check_invariants(&self) -> Result<(), String> {
url/src/lib.rs:609: self.serialization
url/src/lib.rs:623: self.serialization))
url/src/lib.rs:639: if self.username_end != self.serialization.len() as u32 {
url/src/lib.rs:656: let h: Host<String> = Host::Ipv6(address);
url/src/lib.rs:676: self.path_start as usize == self.serialization.len()
url/src/lib.rs:700: let other = Url::parse(self.as_str()).expect("Failed to parse myself?");
url/src/lib.rs:701: assert_eq!(&self.serialization, &other.serialization);
url/src/lib.rs:978: && self.username_end != self.serialization.len() as u32
url/src/lib.rs:1126: /// Note that default port numbers are never reflected by the serialization,
url/src/lib.rs:1422: let mut parser = Parser::for_setter(mem::take(&mut self.serialization));
url/src/lib.rs:1424: self.serialization = parser.serialization;
url/src/lib.rs:1438: /// assert_eq!(url.as_str(), "https://example.com/data.csv");
url/src/lib.rs:1441: /// assert_eq!(url.as_str(), "https://example.com/data.csv#cell=4,1-6,2");
url/src/lib.rs:1445: /// assert_eq!(url.as_str(), "https://example.com/data.csv");
url/src/lib.rs:1455: self.serialization.truncate(start as usize);
url/src/lib.rs:1459: self.fragment_start = Some(to_u32(self.serialization.len()).unwrap());
url/src/lib.rs:1460: self.serialization.push('#');
url/src/lib.rs:1468: fn take_fragment(&mut self) -> Option<String> {
url/src/lib.rs:1472: self.serialization.truncate(start as usize);
url/src/lib.rs:1477: fn restore_already_parsed_fragment(&mut self, fragment: Option<String>) {
url/src/lib.rs:1480: self.fragment_start = Some(to_u32(self.serialization.len()).unwrap());
url/src/lib.rs:1481: self.serialization.push('#');
url/src/lib.rs:1482: self.serialization.push_str(fragment);
url/src/lib.rs:1496: /// assert_eq!(url.as_str(), "https://example.com/products");
url/src/lib.rs:1499: /// assert_eq!(url.as_str(), "https://example.com/products?page=2");
url/src/lib.rs:1511: self.serialization.truncate(start as usize);
url/src/lib.rs:1515: self.query_start = Some(to_u32(self.serialization.len()).unwrap());
url/src/lib.rs:1516: self.serialization.push('?');
url/src/lib.rs:1549: /// assert_eq!(url.as_str(), "https://example.net/?lang=fr&foo=bar#nav");
url/src/lib.rs:1556: /// assert_eq!(url.as_str(),
url/src/lib.rs:1575: query_start = self.serialization.len();
url/src/lib.rs:1577: self.serialization.push('?');
url/src/lib.rs:1587: fn take_after_path(&mut self) -> String {
url/src/lib.rs:1591: self.serialization.truncate(i as usize);
url/src/lib.rs:1594: (None, None) => String::new(),
url/src/lib.rs:1609: /// assert_eq!(url.as_str(), "https://example.com/api/comments");
url/src/lib.rs:1614: /// assert_eq!(url.as_str(), "https://example.com/data/report.csv");
url/src/lib.rs:1620: /// assert_eq!(url.as_str(), "https://example.com/api/some%20comments");
url/src/lib.rs:1626: /// assert_eq!(url.as_str(), "https://example.com/api/some%20comments");
url/src/lib.rs:1635: let old_after_path_pos = to_u32(self.serialization.len()).unwrap();
url/src/lib.rs:1638: self.serialization.truncate(self.path_start as usize);
url/src/lib.rs:1642: parser.serialization.push_str("%2F");
url/src/lib.rs:1667: let new_after_path_position = to_u32(self.serialization.len()).unwrap();
url/src/lib.rs:1678: self.serialization.push_str(after_path)
url/src/lib.rs:1683: /// Note that default port numbers are not reflected in the serialization.
url/src/lib.rs:1698: /// assert_eq!(url.as_str(), "ssh://example.net:4096/");
url/src/lib.rs:1701: /// assert_eq!(url.as_str(), "ssh://example.net/");
url/src/lib.rs:1758: self.serialization
url/src/lib.rs:1772: self.serialization.truncate(self.host_end as usize);
url/src/lib.rs:1773: write!(&mut self.serialization, ":{}", new).unwrap();
url/src/lib.rs:1775: let new_path_start = to_u32(self.serialization.len()).unwrap();
url/src/lib.rs:1787: self.serialization.push_str(&path_and_after);
url/src/lib.rs:1810: /// assert_eq!(url.as_str(), "https://rust-lang.org/");
url/src/lib.rs:1826: /// assert_eq!(url.as_str(), "foo:/");
url/src/lib.rs:1842: /// assert_eq!(url.as_str(), "https://example.net/");
url/src/lib.rs:1859: /// assert_eq!(url.as_str(), "mailto:rms@example.net");
url/src/lib.rs:1863: /// assert_eq!(url.as_str(), "mailto:rms@example.net");
url/src/lib.rs:1909: } else if self.serialization.len() == self.path_start as usize {
url/src/lib.rs:1910: self.serialization.push('/');
url/src/lib.rs:1921: self.serialization
url/src/lib.rs:1940: fn set_host_internal(&mut self, host: Host<String>, opt_new_port: Option<Option<u16>>) {
url/src/lib.rs:1947: self.serialization.truncate(self.host_start as usize);
url/src/lib.rs:1951: self.serialization.push('/');
url/src/lib.rs:1952: self.serialization.push('/');
url/src/lib.rs:1956: write!(&mut self.serialization, "{}", host).unwrap();
url/src/lib.rs:1957: self.host_end = to_u32(self.serialization.len()).unwrap();
url/src/lib.rs:1963: write!(&mut self.serialization, ":{}", port).unwrap();
url/src/lib.rs:1966: let new_suffix_pos = to_u32(self.serialization.len()).unwrap();
url/src/lib.rs:1967: self.serialization.push_str(&suffix);
url/src/lib.rs:1997: /// assert_eq!(url.as_str(), "http://127.0.0.1/");
url/src/lib.rs:2012: /// assert_eq!(url.as_str(), "mailto:rms@example.com");
url/src/lib.rs:2067: self.serialization.truncate(self.username_end as usize);
url/src/lib.rs:2068: self.serialization.push(':');
url/src/lib.rs:2069: self.serialization
url/src/lib.rs:2071: self.serialization.push('@');
url/src/lib.rs:2074: let new_host_start = to_u32(self.serialization.len()).unwrap();
url/src/lib.rs:2089: self.serialization.push_str(&host_and_after);
url/src/lib.rs:2102: self.serialization.drain(start as usize..end as usize);
url/src/lib.rs:2130: /// assert_eq!(url.as_str(), "mailto:rmz@example.com");
url/src/lib.rs:2147: /// assert_eq!(url.as_str(), "ftp://user1:secre1@example.com/");
url/src/lib.rs:2164: self.serialization.truncate(username_start as usize);
url/src/lib.rs:2165: self.serialization
url/src/lib.rs:2169: self.username_end = to_u32(self.serialization.len()).unwrap();
url/src/lib.rs:2176: self.serialization.push_str(&after_username[1..]);
url/src/lib.rs:2179: self.serialization.push_str(&after_username);
url/src/lib.rs:2183: self.serialization.push('@');
url/src/lib.rs:2184: self.serialization.push_str(&after_username);
url/src/lib.rs:2231: /// assert_eq!(url.as_str(), "http://example.net/");
url/src/lib.rs:2246: /// assert_eq!(url.as_str(), "bar://example.net");
url/src/lib.rs:2262: /// assert_eq!(url.as_str(), "https://example.net/");
url/src/lib.rs:2278: /// assert_eq!(url.as_str(), "mailto:rms@example.net");
url/src/lib.rs:2293: /// assert_eq!(url.as_str(), "foo://example.net");
url/src/lib.rs:2308: /// assert_eq!(url.as_str(), "http://example.net/");
url/src/lib.rs:2316: let mut parser = Parser::for_setter(String::new());
url/src/lib.rs:2318: let new_scheme_type = SchemeType::from(&parser.serialization);
url/src/lib.rs:2335: let new_scheme_end = to_u32(parser.serialization.len()).unwrap();
url/src/lib.rs:2353: parser.serialization.push_str(self.slice(old_scheme_end..));
url/src/lib.rs:2354: self.serialization = parser.serialization;
url/src/lib.rs:2381: /// assert_eq!(url.as_str(), "file:///tmp/foo.txt");
url/src/lib.rs:2396: let mut serialization = "file://".to_owned();
url/src/lib.rs:2397: let host_start = serialization.len() as u32;
url/src/lib.rs:2398: let (host_end, host) = path_to_file_url_segments(path.as_ref(), &mut serialization)?;
url/src/lib.rs:2400: serialization,
url/src/lib.rs:2434: if !url.serialization.ends_with('/') {
url/src/lib.rs:2435: url.serialization.push('/')
url/src/lib.rs:2448: pub fn serialize_internal<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
url/src/lib.rs:2456: ref serialization,
url/src/lib.rs:2468: serialization,
url/src/lib.rs:2490: pub fn deserialize_internal<'de, D>(deserializer: D) -> Result<Self, D::Error>
url/src/lib.rs:2496: serialization,
url/src/lib.rs:2508: serialization,
url/src/lib.rs:2554: Some(&self.serialization[self.host_start as usize..self.host_end as usize])
url/src/lib.rs:2571: range.slice_of(&self.serialization)
url/src/lib.rs:2576: self.serialization.as_bytes()[i as usize]
url/src/lib.rs:2598:/// Display the serialization of this URL.
url/src/lib.rs:2602: fmt::Display::fmt(&self.serialization, formatter)
url/src/lib.rs:2606:/// String conversion.
url/src/lib.rs:2607:impl From<Url> for String {
url/src/lib.rs:2608: fn from(value: Url) -> String {
url/src/lib.rs:2609: value.serialization
url/src/lib.rs:2613:/// Debug the serialization of this URL.
url/src/lib.rs:2632:/// URLs compare like their serialization.
url/src/lib.rs:2635:/// URLs compare like their serialization.
url/src/lib.rs:2639: self.serialization == other.serialization
url/src/lib.rs:2643:/// URLs compare like their serialization.
url/src/lib.rs:2647: self.serialization.cmp(&other.serialization)
url/src/lib.rs:2651:/// URLs compare like their serialization.
url/src/lib.rs:2655: self.serialization.partial_cmp(&other.serialization)
url/src/lib.rs:2659:/// URLs hash like their serialization.
url/src/lib.rs:2666: hash::Hash::hash(&self.serialization, state)
url/src/lib.rs:2670:/// Return the serialization of this URL.
url/src/lib.rs:2674: &self.serialization
url/src/lib.rs:2708: fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
url/src/lib.rs:2712: serializer.serialize_str(self.as_str())
url/src/lib.rs:2721: fn deserialize<D>(deserializer: D) -> Result<Url, D::Error>
url/src/lib.rs:2742: Error::invalid_value(Unexpected::Str(s), &err_s.as_str())
url/src/lib.rs:2754: serialization: &mut String,
url/src/lib.rs:2763: let host_end = to_u32(serialization.len()).unwrap();
url/src/lib.rs:2768: serialization.push('/');
url/src/lib.rs:2769: serialization.extend(percent_encode(
url/src/lib.rs:2776: serialization.push('/');
url/src/lib.rs:2784: serialization: &mut String,
url/src/lib.rs:2786: path_to_file_url_segments_windows(path, serialization)
url/src/lib.rs:2793: serialization: &mut String,
url/src/lib.rs:2801: let host_start = serialization.len() + 1;
url/src/lib.rs:2808: host_end = to_u32(serialization.len()).unwrap();
url/src/lib.rs:2810: serialization.push('/');
url/src/lib.rs:2811: serialization.push(letter as char);
url/src/lib.rs:2812: serialization.push(':');
url/src/lib.rs:2816: write!(serialization, "{}", host).unwrap();
url/src/lib.rs:2817: host_end = to_u32(serialization.len()).unwrap();
url/src/lib.rs:2819: serialization.push('/');
url/src/lib.rs:2821: serialization.extend(percent_encode(share.as_bytes(), PATH_SEGMENT));
url/src/lib.rs:2838: serialization.push('/');
url/src/lib.rs:2839: serialization.extend(percent_encode(component.as_bytes(), PATH_SEGMENT));
url/src/lib.rs:2843: if serialization.len() > host_start
url/src/lib.rs:2844: && parser::is_windows_drive_letter(&serialization[host_start..])
url/src/lib.rs:2847: serialization.push('/');
url/src/lib.rs:2946: match String::from_utf8(percent_decode(segment.as_bytes()).collect()) {
url/src/lib.rs:2963: fragment: Option<String>,
url/src/lib.rs:2966:// `as_mut_string` string here exposes the internal serialization of an `Url`,
url/src/lib.rs:2977: fn as_mut_string(&mut self) -> &mut String {
url/src/lib.rs:2978: &mut self.url.as_mut().unwrap().serialization
sed -n '160,210p' url/src/lib.rs
Chunk ID: ae8a55
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 398
Output:
mod origin;
mod parser;
mod path_segments;
mod slicing;
#[doc(hidden)]
pub mod quirks;
/// A parsed URL record.
#[derive(Clone)]
pub struct Url {
/// Syntax in pseudo-BNF:
///
/// url = scheme ":" [ hierarchical | non-hierarchical ] [ "?" query ]? [ "#" fragment ]?
/// non-hierarchical = non-hierarchical-path
/// non-hierarchical-path = /* Does not start with "/" */
/// hierarchical = authority? hierarchical-path
/// authority = "//" userinfo? host [ ":" port ]?
/// userinfo = username [ ":" password ]? "@"
/// hierarchical-path = [ "/" path-segment ]+
serialization: String,
// Components
scheme_end: u32, // Before ':'
username_end: u32, // Before ':' (if a password is given) or '@' (if not)
host_start: u32,
host_end: u32,
host: HostInternal,
port: Option<u16>,
path_start: u32, // Before initial '/', if any
query_start: Option<u32>, // Before '?', unlike Position::QueryStart
fragment_start: Option<u32>, // Before '#', unlike Position::FragmentStart
}
/// Full configuration for the URL parser.
#[derive(Copy, Clone)]
pub struct ParseOptions<'a> {
base_url: Option<&'a Url>,
encoding_override: EncodingOverride<'a>,
violation_fn: Option<&'a dyn Fn(SyntaxViolation)>,
}
impl<'a> ParseOptions<'a> {
/// Change the base URL
pub fn base_url(mut self, new: Option<&'a Url>) -> Self {
self.base_url = new;
self
}
/// Override the character encoding of query strings.
/// This is a legacy concept only relevant for HTML.
sed -n '580,725p' url/src/lib.rs
Chunk ID: 95cece
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 1472
Output:
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let url_str = "https://example.net/";
/// let url = Url::parse(url_str)?;
/// assert_eq!(String::from(url), url_str);
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
#[inline]
#[deprecated(since = "2.3.0", note = "use Into<String>")]
pub fn into_string(self) -> String {
self.into()
}
/// For internal testing, not part of the public API.
///
/// Methods of the `Url` struct assume a number of invariants.
/// This checks each of these invariants and panic if one is not met.
/// This is for testing rust-url itself.
#[doc(hidden)]
pub fn check_invariants(&self) -> Result<(), String> {
macro_rules! assert {
($x: expr) => {
if !$x {
return Err(format!(
"!( {} ) for URL {:?}",
stringify!($x),
self.serialization
));
}
};
}
macro_rules! assert_eq {
($a: expr, $b: expr) => {
{
let a = $a;
let b = $b;
if a != b {
return Err(format!("{:?} != {:?} ({} != {}) for URL {:?}",
a, b, stringify!($a), stringify!($b),
self.serialization))
}
}
}
}
assert!(self.scheme_end >= 1);
assert!(self.byte_at(0).is_ascii_alphabetic());
assert!(self
.slice(1..self.scheme_end)
.chars()
.all(|c| matches!(c, 'a'..='z' | 'A'..='Z' | '0'..='9' | '+' | '-' | '.')));
assert_eq!(self.byte_at(self.scheme_end), b':');
if self.slice(self.scheme_end + 1..).starts_with("//") {
// URL with authority
if self.username_end != self.serialization.len() as u32 {
match self.byte_at(self.username_end) {
b':' => {
assert!(self.host_start >= self.username_end + 2);
assert_eq!(self.byte_at(self.host_start - 1), b'@');
}
b'@' => assert!(self.host_start == self.username_end + 1),
_ => assert_eq!(self.username_end, self.scheme_end + 3),
}
}
assert!(self.host_start >= self.username_end);
assert!(self.host_end >= self.host_start);
let host_str = self.slice(self.host_start..self.host_end);
match self.host {
HostInternal::None => assert_eq!(host_str, ""),
HostInternal::Ipv4(address) => assert_eq!(host_str, address.to_string()),
HostInternal::Ipv6(address) => {
let h: Host<String> = Host::Ipv6(address);
assert_eq!(host_str, h.to_string())
}
HostInternal::Domain => {
if SchemeType::from(self.scheme()).is_special() {
assert!(!host_str.is_empty())
}
}
}
if self.path_start == self.host_end {
assert_eq!(self.port, None);
} else {
assert_eq!(self.byte_at(self.host_end), b':');
let port_str = self.slice(self.host_end + 1..self.path_start);
assert_eq!(
self.port,
Some(port_str.parse::<u16>().expect("Couldn't parse port?"))
);
}
assert!(
self.path_start as usize == self.serialization.len()
|| matches!(self.byte_at(self.path_start), b'/' | b'#' | b'?')
);
} else {
// Anarchist URL (no authority)
assert_eq!(self.username_end, self.scheme_end + 1);
assert_eq!(self.host_start, self.scheme_end + 1);
assert_eq!(self.host_end, self.scheme_end + 1);
assert_eq!(self.host, HostInternal::None);
assert_eq!(self.port, None);
assert_eq!(self.path_start, self.scheme_end + 1);
}
if let Some(start) = self.query_start {
assert!(start >= self.path_start);
assert_eq!(self.byte_at(start), b'?');
}
if let Some(start) = self.fragment_start {
assert!(start >= self.path_start);
assert_eq!(self.byte_at(start), b'#');
}
if let (Some(query_start), Some(fragment_start)) = (self.query_start, self.fragment_start) {
assert!(fragment_start > query_start);
}
let other = Url::parse(self.as_str()).expect("Failed to parse myself?");
assert_eq!(&self.serialization, &other.serialization);
assert_eq!(self.scheme_end, other.scheme_end);
assert_eq!(self.username_end, other.username_end);
assert_eq!(self.host_start, other.host_start);
assert_eq!(self.host_end, other.host_end);
assert!(
self.host == other.host ||
// XXX No host round-trips to empty host.
// See https://[code-host]/whatwg/url/issues/79
(self.host_str(), other.host_str()) == (None, Some(""))
);
assert_eq!(self.port, other.port);
assert_eq!(self.path_start, other.path_start);
assert_eq!(self.query_start, other.query_start);
assert_eq!(self.fragment_start, other.fragment_start);
Ok(())
}
/// Return the origin of this URL (<https://url.spec.whatwg.org/#origin>)
///
/// Note: this returns an opaque origin for `file:` URLs, which causes
/// `url.origin() != url.origin()`.
///
/// # Examples
///
sed -n '450,500p' url/src/parser.rs
Chunk ID: 34f208
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 409
Output:
!= "//"
});
self.after_double_slash(remaining, scheme_type, scheme_end)
}
SchemeType::NotSpecial => self.parse_non_special(input, scheme_type, scheme_end),
}
}
/// Scheme other than file, http, https, ws, ws, ftp.
fn parse_non_special(
mut self,
input: Input<'_>,
scheme_type: SchemeType,
scheme_end: u32,
) -> ParseResult<Url> {
// path or authority state (
if let Some(input) = input.split_prefix("//") {
return self.after_double_slash(input, scheme_type, scheme_end);
}
// Anarchist URL (no authority)
let path_start = to_u32(self.serialization.len())?;
let username_end = path_start;
let host_start = path_start;
let host_end = path_start;
let host = HostInternal::None;
let port = None;
let remaining = if let Some(input) = input.split_prefix('/') {
let path_start = self.serialization.len();
self.serialization.push('/');
self.parse_path(scheme_type, &mut false, path_start, input)
} else {
self.parse_cannot_be_a_base_path(input)
};
self.with_query_and_fragment(
scheme_type,
scheme_end,
username_end,
host_start,
host_end,
host,
port,
path_start,
remaining,
)
}
fn parse_file(
mut self,
input: Input<'_>,
scheme_type: SchemeType,
base_file_url: Option<&Url>,
sed -n '707,835p' url/src/parser.rs
Chunk ID: 36c351
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 1381
Output:
fn parse_relative(
mut self,
input: Input<'_>,
scheme_type: SchemeType,
base_url: &Url,
) -> ParseResult<Url> {
// relative state
debug_assert!(self.serialization.is_empty());
let (first_char, input_after_first_char) = input.split_first();
match first_char {
None => {
// Copy everything except the fragment
let before_fragment = match base_url.fragment_start {
Some(i) => &base_url.serialization[..i as usize],
None => &*base_url.serialization,
};
self.serialization.push_str(before_fragment);
Ok(Url {
serialization: self.serialization,
fragment_start: None,
..*base_url
})
}
Some('?') => {
// Copy everything up to the query string
let before_query = match (base_url.query_start, base_url.fragment_start) {
(None, None) => &*base_url.serialization,
(Some(i), _) | (None, Some(i)) => base_url.slice(..i),
};
self.serialization.push_str(before_query);
let (query_start, fragment_start) =
self.parse_query_and_fragment(scheme_type, base_url.scheme_end, input)?;
Ok(Url {
serialization: self.serialization,
query_start,
fragment_start,
..*base_url
})
}
Some('#') => self.fragment_only(base_url, input),
Some('/') | Some('\\') => {
let (slashes_count, remaining) = input.count_matching(|c| matches!(c, '/' | '\\'));
if slashes_count >= 2 {
self.log_violation_if(SyntaxViolation::ExpectedDoubleSlash, || {
input
.clone()
.take_while(|&c| matches!(c, '/' | '\\'))
.collect::<String>()
!= "//"
});
let scheme_end = base_url.scheme_end;
debug_assert!(base_url.byte_at(scheme_end) == b':');
self.serialization
.push_str(base_url.slice(..scheme_end + 1));
if let Some(after_prefix) = input.split_prefix("//") {
return self.after_double_slash(after_prefix, scheme_type, scheme_end);
}
return self.after_double_slash(remaining, scheme_type, scheme_end);
}
let path_start = base_url.path_start;
self.serialization.push_str(base_url.slice(..path_start));
self.serialization.push('/');
let remaining = self.parse_path(
scheme_type,
&mut true,
path_start as usize,
input_after_first_char,
);
self.with_query_and_fragment(
scheme_type,
base_url.scheme_end,
base_url.username_end,
base_url.host_start,
base_url.host_end,
base_url.host,
base_url.port,
base_url.path_start,
remaining,
)
}
_ => {
let before_query = match (base_url.query_start, base_url.fragment_start) {
(None, None) => &*base_url.serialization,
(Some(i), _) | (None, Some(i)) => base_url.slice(..i),
};
self.serialization.push_str(before_query);
// FIXME spec says just "remove last entry", not the "pop" algorithm
self.pop_path(scheme_type, base_url.path_start as usize);
// A special url always has a path.
// A path always starts with '/'
if self.serialization.len() == base_url.path_start as usize
&& (SchemeType::from(base_url.scheme()).is_special() || !input.is_empty())
{
self.serialization.push('/');
}
let remaining = match input.split_first() {
(Some('/'), remaining) => self.parse_path(
scheme_type,
&mut true,
base_url.path_start as usize,
remaining,
),
_ => {
self.parse_path(scheme_type, &mut true, base_url.path_start as usize, input)
}
};
self.with_query_and_fragment(
scheme_type,
base_url.scheme_end,
base_url.username_end,
base_url.host_start,
base_url.host_end,
base_url.host,
base_url.port,
base_url.path_start,
remaining,
)
}
}
}
fn after_double_slash(
mut self,
input: Input<'_>,
scheme_type: SchemeType,
scheme_end: u32,
) -> ParseResult<Url> {
self.serialization.push('/');
self.serialization.push('/');
sed -n '1127,1335p' url/src/parser.rs
Chunk ID: 97e483
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 2392
Output:
pub fn parse_path_start<'i>(
&mut self,
scheme_type: SchemeType,
has_host: &mut bool,
input: Input<'i>,
) -> Input<'i> {
let path_start = self.serialization.len();
let (maybe_c, remaining) = input.split_first();
// If url is special, then:
if scheme_type.is_special() {
if maybe_c == Some('\\') {
// If c is U+005C (\), validation error.
self.log_violation(SyntaxViolation::Backslash);
}
// A special URL always has a non-empty path.
if !self.serialization.ends_with('/') {
self.serialization.push('/');
// We have already made sure the forward slash is present.
if maybe_c == Some('/') || maybe_c == Some('\\') {
return self.parse_path(scheme_type, has_host, path_start, remaining);
}
}
return self.parse_path(scheme_type, has_host, path_start, input);
} else if maybe_c == Some('?') || maybe_c == Some('#') {
// Otherwise, if state override is not given and c is U+003F (?),
// set url’s query to the empty string and state to query state.
// Otherwise, if state override is not given and c is U+0023 (#),
// set url’s fragment to the empty string and state to fragment state.
// The query and path states will be handled by the caller.
return input;
}
if maybe_c.is_some() && maybe_c != Some('/') {
self.serialization.push('/');
}
// Otherwise, if c is not the EOF code point:
self.parse_path(scheme_type, has_host, path_start, input)
}
pub fn parse_path<'i>(
&mut self,
scheme_type: SchemeType,
has_host: &mut bool,
path_start: usize,
mut input: Input<'i>,
) -> Input<'i> {
// Relative path state
loop {
let segment_start = self.serialization.len();
let mut ends_with_slash = false;
loop {
let input_before_c = input.clone();
let (c, utf8_c) = if let Some(x) = input.next_utf8() {
x
} else {
break;
};
match c {
'/' if self.context != Context::PathSegmentSetter => {
self.serialization.push(c);
ends_with_slash = true;
break;
}
'\\' if self.context != Context::PathSegmentSetter
&& scheme_type.is_special() =>
{
self.log_violation(SyntaxViolation::Backslash);
self.serialization.push('/');
ends_with_slash = true;
break;
}
'?' | '#' if self.context == Context::UrlParser => {
input = input_before_c;
break;
}
_ => {
self.check_url_code_point(c, &input);
if self.context == Context::PathSegmentSetter {
if scheme_type.is_special() {
self.serialization
.extend(utf8_percent_encode(utf8_c, SPECIAL_PATH_SEGMENT));
} else {
self.serialization
.extend(utf8_percent_encode(utf8_c, PATH_SEGMENT));
}
} else {
self.serialization.extend(utf8_percent_encode(utf8_c, PATH));
}
}
}
}
let segment_before_slash = if ends_with_slash {
&self.serialization[segment_start..self.serialization.len() - 1]
} else {
&self.serialization[segment_start..self.serialization.len()]
};
match segment_before_slash {
// If buffer is a double-dot path segment, shorten url’s path,
".." | "%2e%2e" | "%2e%2E" | "%2E%2e" | "%2E%2E" | "%2e." | "%2E." | ".%2e"
| ".%2E" => {
debug_assert!(self.serialization.as_bytes()[segment_start - 1] == b'/');
self.serialization.truncate(segment_start);
if self.serialization.ends_with('/')
&& Parser::last_slash_can_be_removed(&self.serialization, path_start)
{
self.serialization.pop();
}
self.shorten_path(scheme_type, path_start);
// and then if neither c is U+002F (/), nor url is special and c is U+005C (\), append the empty string to url’s path.
if ends_with_slash && !self.serialization.ends_with('/') {
self.serialization.push('/');
}
}
// Otherwise, if buffer is a single-dot path segment and if neither c is U+002F (/),
// nor url is special and c is U+005C (\), append the empty string to url’s path.
"." | "%2e" | "%2E" => {
self.serialization.truncate(segment_start);
if !self.serialization.ends_with('/') {
self.serialization.push('/');
}
}
_ => {
// If url’s scheme is "file", url’s path is empty, and buffer is a Windows drive letter, then
if scheme_type.is_file() && is_windows_drive_letter(segment_before_slash) {
// Replace the second code point in buffer with U+003A (:).
if let Some(c) = segment_before_slash.chars().next() {
self.serialization.truncate(segment_start);
self.serialization.push(c);
self.serialization.push(':');
if ends_with_slash {
self.serialization.push('/');
}
}
// If url’s host is neither the empty string nor null,
// validation error, set url’s host to the empty string.
if *has_host {
self.log_violation(SyntaxViolation::FileWithHostAndWindowsDrive);
*has_host = false; // FIXME account for this in callers
}
}
}
}
if !ends_with_slash {
break;
}
}
if scheme_type.is_file() {
// while url’s path’s size is greater than 1
// and url’s path[0] is the empty string,
// validation error, remove the first item from url’s path.
//FIXME: log violation
let path = self.serialization.split_off(path_start);
self.serialization.push('/');
self.serialization.push_str(path.trim_start_matches('/'));
}
input
}
fn last_slash_can_be_removed(serialization: &str, path_start: usize) -> bool {
let url_before_segment = &serialization[..serialization.len() - 1];
if let Some(segment_before_start) = url_before_segment.rfind('/') {
// Do not remove the root slash
segment_before_start >= path_start
// Or a windows drive letter slash
&& !path_starts_with_windows_drive_letter(&serialization[segment_before_start..])
} else {
false
}
}
/// https://url.spec.whatwg.org/#shorten-a-urls-path
fn shorten_path(&mut self, scheme_type: SchemeType, path_start: usize) {
// If path is empty, then return.
if self.serialization.len() == path_start {
return;
}
// If url’s scheme is "file", path’s size is 1, and path[0] is a normalized Windows drive letter, then return.
if scheme_type.is_file()
&& is_normalized_windows_drive_letter(&self.serialization[path_start..])
{
return;
}
// Remove path’s last item.
self.pop_path(scheme_type, path_start);
}
/// https://url.spec.whatwg.org/#pop-a-urls-path
fn pop_path(&mut self, scheme_type: SchemeType, path_start: usize) {
if self.serialization.len() > path_start {
let slash_position = self.serialization[path_start..].rfind('/').unwrap();
// + 1 since rfind returns the position before the slash.
let segment_start = path_start + slash_position + 1;
// Don’t pop a Windows drive letter
if !(scheme_type.is_file()
&& is_normalized_windows_drive_letter(&self.serialization[segment_start..]))
{
self.serialization.truncate(segment_start);
}
}
}
pub fn parse_cannot_be_a_base_path<'i>(&mut self, mut input: Input<'i>) -> Input<'i> {
loop {
let input_before_c = input.clone();
match input.next_utf8() {
Some(('?', _)) | Some(('#', _)) if self.context == Context::UrlParser => {
return input_before_c
sed -n '81,186p' url/src/slicing.rs
Chunk ID: c70916
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 879
Output:
pub enum Position {
BeforeScheme,
AfterScheme,
BeforeUsername,
AfterUsername,
BeforePassword,
AfterPassword,
BeforeHost,
AfterHost,
BeforePort,
AfterPort,
BeforePath,
AfterPath,
BeforeQuery,
AfterQuery,
BeforeFragment,
AfterFragment,
}
impl Url {
#[inline]
fn index(&self, position: Position) -> usize {
match position {
Position::BeforeScheme => 0,
Position::AfterScheme => self.scheme_end as usize,
Position::BeforeUsername => {
if self.has_authority() {
self.scheme_end as usize + "://".len()
} else {
debug_assert!(self.byte_at(self.scheme_end) == b':');
debug_assert!(self.scheme_end + ":".len() as u32 == self.username_end);
self.scheme_end as usize + ":".len()
}
}
Position::AfterUsername => self.username_end as usize,
Position::BeforePassword => {
if self.has_authority() && self.byte_at(self.username_end) == b':' {
self.username_end as usize + ":".len()
} else {
debug_assert!(self.username_end == self.host_start);
self.username_end as usize
}
}
Position::AfterPassword => {
if self.has_authority() && self.byte_at(self.username_end) == b':' {
debug_assert!(self.byte_at(self.host_start - "@".len() as u32) == b'@');
self.host_start as usize - "@".len()
} else {
debug_assert!(self.username_end == self.host_start);
self.host_start as usize
}
}
Position::BeforeHost => self.host_start as usize,
Position::AfterHost => self.host_end as usize,
Position::BeforePort => {
if self.port.is_some() {
debug_assert!(self.byte_at(self.host_end) == b':');
self.host_end as usize + ":".len()
} else {
self.host_end as usize
}
}
Position::AfterPort => self.path_start as usize,
Position::BeforePath => self.path_start as usize,
Position::AfterPath => match (self.query_start, self.fragment_start) {
(Some(q), _) => q as usize,
(None, Some(f)) => f as usize,
(None, None) => self.serialization.len(),
},
Position::BeforeQuery => match (self.query_start, self.fragment_start) {
(Some(q), _) => {
debug_assert!(self.byte_at(q) == b'?');
q as usize + "?".len()
}
(None, Some(f)) => f as usize,
(None, None) => self.serialization.len(),
},
Position::AfterQuery => match self.fragment_start {
None => self.serialization.len(),
Some(f) => f as usize,
},
Position::BeforeFragment => match self.fragment_start {
Some(f) => {
debug_assert!(self.byte_at(f) == b'#');
f as usize + "#".len()
}
None => self.serialization.len(),
},
Position::AfterFragment => self.serialization.len(),
}
}
sed -n '840,930p' url/src/lib.rs
Chunk ID: 522d5b
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 798
Output:
/// # run().unwrap();
/// ```
#[inline]
pub fn has_authority(&self) -> bool {
debug_assert!(self.byte_at(self.scheme_end) == b':');
self.slice(self.scheme_end..).starts_with("://")
}
/// Return the authority of this URL as an ASCII string.
///
/// Non-ASCII domains are punycode-encoded per IDNA if this is the host
/// of a special URL, or percent encoded for non-special URLs.
/// IPv6 addresses are given between `[` and `]` brackets.
/// Ports are omitted if they match the well known port of a special URL.
///
/// Username and password are percent-encoded.
///
/// See also the `has_authority` method.
///
/// # Examples
///
/// ```
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let url = Url::parse("unix:/run/foo.socket")?;
/// assert_eq!(url.authority(), "");
/// let url = Url::parse("file:///tmp/foo")?;
/// assert_eq!(url.authority(), "");
/// let url = Url::parse("https://user:password@example.com/tmp/foo")?;
/// assert_eq!(url.authority(), "user:password@example.com");
/// let url = Url::parse("irc://àlex.рф.example.com:6667/foo")?;
/// assert_eq!(url.authority(), "%C3%A0lex.%D1%80%D1%84.example.com:6667");
/// let url = Url::parse("http://àlex.рф.example.com:80/foo")?;
/// assert_eq!(url.authority(), "xn--lex-8ka.xn--p1ai.example.com");
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
pub fn authority(&self) -> &str {
let scheme_separator_len = "://".len() as u32;
if self.has_authority() && self.path_start > self.scheme_end + scheme_separator_len {
self.slice(self.scheme_end + scheme_separator_len..self.path_start)
} else {
""
}
}
/// Return whether this URL is a cannot-be-a-base URL,
/// meaning that parsing a relative URL string with this URL as the base will return an error.
///
/// This is the case if the scheme and `:` delimiter are not followed by a `/` slash,
/// as is typically the case of `data:` and `mailto:` URLs.
///
/// # Examples
///
/// ```
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let url = Url::parse("ftp://rms@example.com")?;
/// assert!(!url.cannot_be_a_base());
///
/// let url = Url::parse("unix:/run/foo.socket")?;
/// assert!(!url.cannot_be_a_base());
///
/// let url = Url::parse("data:text/plain,Stuff")?;
/// assert!(url.cannot_be_a_base());
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
#[inline]
pub fn cannot_be_a_base(&self) -> bool {
!self.slice(self.scheme_end + 1..).starts_with('/')
}
/// Return the username for this URL (typically the empty string)
/// as a percent-encoded ASCII string.
///
/// # Examples
///
/// ```
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let url = Url::parse("ftp://rms@example.com")?;
/// assert_eq!(url.username(), "rms");
sed -n '1240,1320p' url/src/lib.rs
Chunk ID: 766ade
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 764
Output:
/// Return the path for this URL, as a percent-encoded ASCII string.
/// For cannot-be-a-base URLs, this is an arbitrary string that doesn’t start with '/'.
/// For other URLs, this starts with a '/' slash
/// and continues with slash-separated path segments.
///
/// # Examples
///
/// ```rust
/// use url::{Url, ParseError};
///
/// # fn run() -> Result<(), ParseError> {
/// let url = Url::parse("https://example.com/api/versions?page=2")?;
/// assert_eq!(url.path(), "/api/versions");
///
/// let url = Url::parse("https://example.com")?;
/// assert_eq!(url.path(), "/");
///
/// let url = Url::parse("https://example.com/countries/việt nam")?;
/// assert_eq!(url.path(), "/countries/vi%E1%BB%87t%20nam");
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
pub fn path(&self) -> &str {
match (self.query_start, self.fragment_start) {
(None, None) => self.slice(self.path_start..),
(Some(next_component_start), _) | (None, Some(next_component_start)) => {
self.slice(self.path_start..next_component_start)
}
}
}
/// Unless this URL is cannot-be-a-base,
/// return an iterator of '/' slash-separated path segments,
/// each as a percent-encoded ASCII string.
///
/// Return `None` for cannot-be-a-base URLs.
///
/// When `Some` is returned, the iterator always contains at least one string
/// (which may be empty).
///
/// # Examples
///
/// ```
/// use url::Url;
/// # use std::error::Error;
///
/// # fn run() -> Result<(), Box<dyn Error>> {
/// let url = Url::parse("https://example.com/foo/bar")?;
/// let mut path_segments = url.path_segments().ok_or_else(|| "cannot be base")?;
/// assert_eq!(path_segments.next(), Some("foo"));
/// assert_eq!(path_segments.next(), Some("bar"));
/// assert_eq!(path_segments.next(), None);
///
/// let url = Url::parse("https://example.com")?;
/// let mut path_segments = url.path_segments().ok_or_else(|| "cannot be base")?;
/// assert_eq!(path_segments.next(), Some(""));
/// assert_eq!(path_segments.next(), None);
///
/// let url = Url::parse("data:text/plain,HelloWorld")?;
/// assert!(url.path_segments().is_none());
///
/// let url = Url::parse("https://example.com/countries/việt nam")?;
/// let mut path_segments = url.path_segments().ok_or_else(|| "cannot be base")?;
/// assert_eq!(path_segments.next(), Some("countries"));
/// assert_eq!(path_segments.next(), Some("vi%E1%BB%87t%20nam"));
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
pub fn path_segments(&self) -> Option<str::Split<'_, char>> {
let path = self.path();
path.strip_prefix('/').map(|remainder| remainder.split('/'))
}
/// Return this URL’s query string, if any, as a percent-encoded ASCII string.
///
/// # Examples
///
/// ```rust
/// use url::Url;
sed -n '1580,1690p' url/src/lib.rs
Chunk ID: a62a09
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 1030
Output:
let query = UrlQuery {
url: Some(self),
fragment,
};
form_urlencoded::Serializer::for_suffix(query, query_start + "?".len())
}
fn take_after_path(&mut self) -> String {
match (self.query_start, self.fragment_start) {
(Some(i), _) | (None, Some(i)) => {
let after_path = self.slice(i..).to_owned();
self.serialization.truncate(i as usize);
after_path
}
(None, None) => String::new(),
}
}
/// Change this URL’s path.
///
/// # Examples
///
/// ```rust
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let mut url = Url::parse("https://example.com")?;
/// url.set_path("api/comments");
/// assert_eq!(url.as_str(), "https://example.com/api/comments");
/// assert_eq!(url.path(), "/api/comments");
///
/// let mut url = Url::parse("https://example.com/api")?;
/// url.set_path("data/report.csv");
/// assert_eq!(url.as_str(), "https://example.com/data/report.csv");
/// assert_eq!(url.path(), "/data/report.csv");
///
/// // `set_path` percent-encodes the given string if it's not already percent-encoded.
/// let mut url = Url::parse("https://example.com")?;
/// url.set_path("api/some comments");
/// assert_eq!(url.as_str(), "https://example.com/api/some%20comments");
/// assert_eq!(url.path(), "/api/some%20comments");
///
/// // `set_path` will not double percent-encode the string if it's already percent-encoded.
/// let mut url = Url::parse("https://example.com")?;
/// url.set_path("api/some%20comments");
/// assert_eq!(url.as_str(), "https://example.com/api/some%20comments");
/// assert_eq!(url.path(), "/api/some%20comments");
///
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
pub fn set_path(&mut self, mut path: &str) {
let after_path = self.take_after_path();
let old_after_path_pos = to_u32(self.serialization.len()).unwrap();
let cannot_be_a_base = self.cannot_be_a_base();
let scheme_type = SchemeType::from(self.scheme());
self.serialization.truncate(self.path_start as usize);
self.mutate(|parser| {
if cannot_be_a_base {
if path.starts_with('/') {
parser.serialization.push_str("%2F");
path = &path[1..];
}
parser.parse_cannot_be_a_base_path(parser::Input::new(path));
} else {
let mut has_host = true; // FIXME
parser.parse_path_start(scheme_type, &mut has_host, parser::Input::new(path));
}
});
self.restore_after_path(old_after_path_pos, &after_path);
}
/// Return an object with methods to manipulate this URL’s path segments.
///
/// Return `Err(())` if this URL is cannot-be-a-base.
#[allow(clippy::result_unit_err)]
pub fn path_segments_mut(&mut self) -> Result<PathSegmentsMut<'_>, ()> {
if self.cannot_be_a_base() {
Err(())
} else {
Ok(path_segments::new(self))
}
}
fn restore_after_path(&mut self, old_after_path_position: u32, after_path: &str) {
let new_after_path_position = to_u32(self.serialization.len()).unwrap();
let adjust = |index: &mut u32| {
*index -= old_after_path_position;
*index += new_after_path_position;
};
if let Some(ref mut index) = self.query_start {
adjust(index)
}
if let Some(ref mut index) = self.fragment_start {
adjust(index)
}
self.serialization.push_str(after_path)
}
/// Change this URL’s port number.
///
/// Note that default port numbers are not reflected in the serialization.
///
/// If this URL is cannot-be-a-base, does not have a host, or has the `file` scheme;
/// do nothing and return `Err`.
///
/// # Examples
///
/// ```
sed -n '1340,1380p' url/src/parser.rs
Chunk ID: 87373a
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 273
Output:
.extend(utf8_percent_encode(utf8_c, CONTROLS));
}
None => return input,
}
}
}
#[allow(clippy::too_many_arguments)]
fn with_query_and_fragment(
mut self,
scheme_type: SchemeType,
scheme_end: u32,
username_end: u32,
host_start: u32,
host_end: u32,
host: HostInternal,
port: Option<u16>,
path_start: u32,
remaining: Input<'_>,
) -> ParseResult<Url> {
let (query_start, fragment_start) =
self.parse_query_and_fragment(scheme_type, scheme_end, remaining)?;
Ok(Url {
serialization: self.serialization,
scheme_end,
username_end,
host_start,
host_end,
host,
port,
path_start,
query_start,
fragment_start,
})
}
/// Return (query_start, fragment_start)
fn parse_query_and_fragment(
&mut self,
scheme_type: SchemeType,
scheme_end: u32,
rg -n "Position::|check_invariants|join\(|non_special|cannot_be_a_base|path\(\)" url/tests url/src -g '*.rs'
Chunk ID: 2c4fbd
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 2617
Output:
url/tests/data.rs:58: base.join(&input)
url/tests/data.rs:86: passed &= check_invariants(&url, &format!("invariants for {:?}", input), None);
url/tests/data.rs:138: passed &= check_invariants(&url, &name, comment_ref);
url/tests/data.rs:147: passed &= check_invariants(&url, &name, comment_ref);
url/tests/data.rs:154:fn check_invariants(url: &Url, name: &str, comment: Option<&str>) -> bool {
url/tests/data.rs:156: if let Err(e) = url.check_invariants() {
url/src/slicing.rs:48:/// let serialization_without_fragment: &str = &some_url[..Position::AfterQuery];
url/src/slicing.rs:49:/// let authority: &str = &some_url[Position::BeforeUsername..Position::AfterPort];
url/src/slicing.rs:50:/// let data_url_payload: &str = &some_url[Position::BeforePath..Position::AfterQuery];
url/src/slicing.rs:51:/// let scheme_relative: &str = &some_url[Position::BeforeUsername..];
url/src/slicing.rs:104: Position::BeforeScheme => 0,
url/src/slicing.rs:106: Position::AfterScheme => self.scheme_end as usize,
url/src/slicing.rs:108: Position::BeforeUsername => {
url/src/slicing.rs:118: Position::AfterUsername => self.username_end as usize,
url/src/slicing.rs:120: Position::BeforePassword => {
url/src/slicing.rs:129: Position::AfterPassword => {
url/src/slicing.rs:139: Position::BeforeHost => self.host_start as usize,
url/src/slicing.rs:141: Position::AfterHost => self.host_end as usize,
url/src/slicing.rs:143: Position::BeforePort => {
url/src/slicing.rs:152: Position::AfterPort => self.path_start as usize,
url/src/slicing.rs:154: Position::BeforePath => self.path_start as usize,
url/src/slicing.rs:156: Position::AfterPath => match (self.query_start, self.fragment_start) {
url/src/slicing.rs:162: Position::BeforeQuery => match (self.query_start, self.fragment_start) {
url/src/slicing.rs:171: Position::AfterQuery => match self.fragment_start {
url/src/slicing.rs:176: Position::BeforeFragment => match self.fragment_start {
url/src/slicing.rs:184: Position::AfterFragment => self.serialization.len(),
url/src/origin.rs:18: let result = Url::parse(url.path());
url/src/quirks.rs:143: &url[Position::BeforeHost..Position::AfterPort]
url/src/quirks.rs:150: if url.cannot_be_a_base() {
url/src/quirks.rs:202: if url.cannot_be_a_base() {
url/src/quirks.rs:238: &url[Position::BeforePort..Position::AfterPort]
url/src/quirks.rs:246: // has_host implies !cannot_be_a_base
url/src/quirks.rs:268: url.path()
url/src/quirks.rs:273: if url.cannot_be_a_base() {
url/src/quirks.rs:291: trim(&url[Position::AfterPath..Position::AfterQuery])
url/src/quirks.rs:305: trim(&url[Position::AfterQuery..])
url/tests/unit.rs:26: let url = base.join("/resources/testharness.js").unwrap();
url/tests/unit.rs:33: let url = base.join("").unwrap();
url/tests/unit.rs:38:fn test_strip_trailing_spaces_from_opaque_path() {
url/tests/unit.rs:92: assert_eq!(url.path(), $url_path);
url/tests/unit.rs:93: assert_eq!(url.to_file_path(), Ok(PathBuf::from($path)));
url/tests/unit.rs:125: assert_eq!(url.to_file_path(), Ok(PathBuf::from(os_str)));
url/tests/unit.rs:137: .to_file_path()
url/tests/unit.rs:146: assert_eq!(url.to_file_path(), Ok(PathBuf::from(r"C:\foo\bar")));
url/tests/unit.rs:158: assert_eq!(url.path(), "/foo/bar/");
url/tests/unit.rs:171: assert_eq!(url.path(), "/C:/foo/bar/");
url/tests/unit.rs:208: assert_eq!(url.path(), "/a");
url/tests/unit.rs:210: assert_eq!(url.path(), "/...");
url/tests/unit.rs:212: assert_eq!(url.path(), "/");
url/tests/unit.rs:402: url.check_invariants().unwrap();
url/tests/unit.rs:410: url.check_invariants().unwrap();
url/tests/unit.rs:422: Url::parse("mailto:").unwrap().cannot_be_a_base();
url/tests/unit.rs:429: url.check_invariants().unwrap();
url/tests/unit.rs:431: url.check_invariants().unwrap();
url/tests/unit.rs:441: url.check_invariants().unwrap();
url/tests/unit.rs:447: url.check_invariants().unwrap();
url/tests/unit.rs:458: url.check_invariants().unwrap();
url/tests/unit.rs:460: url.check_invariants().unwrap();
url/tests/unit.rs:627: assert!(no_base_url.cannot_be_a_base());
url/tests/unit.rs:636: assert_eq!(no_base_url.path(), "%2Ffoo");
url/tests/unit.rs:771:fn test_windows_unc_path() {
url/tests/unit.rs:785: let path = url.to_file_path().unwrap();
url/tests/unit.rs:830: assert_eq!(url.path(), "/path");
url/tests/unit.rs:884:fn test_url_from_file_path() {
url/tests/unit.rs:890: let path = u.to_file_path().unwrap();
url/tests/unit.rs:897:fn test_url_from_file_path() {
url/tests/unit.rs:903: let path = u.to_file_path().unwrap();
url/tests/unit.rs:908:fn test_non_special_path() {
url/tests/unit.rs:913: assert_eq!(db_url.path(), "/diesel_foo");
url/tests/unit.rs:917:fn test_non_special_path2() {
url/tests/unit.rs:921: assert_eq!(db_url.path(), "");
url/tests/unit.rs:924: assert_eq!(db_url.path(), "/foo");
url/tests/unit.rs:927: assert_eq!(db_url.path(), "/bar");
url/tests/unit.rs:932:fn test_non_special_path3() {
url/tests/unit.rs:937: assert_eq!(db_url.path(), "/");
url/tests/unit.rs:940: assert_eq!(db_url.path(), "/foo");
url/tests/unit.rs:967: use url::Position::*;
url/tests/unit.rs:1153: base_uri.join(relative).unwrap().as_str(),
url/tests/debugger_visualizer.rs:14: dx url_with_non_special_scheme
url/tests/debugger_visualizer.rs:34: url_with_non_special_scheme : "non-special://test/x" [Type: url::Url]
url/tests/debugger_visualizer.rs:79: let url_with_non_special_scheme = Url::parse("non-special://:@test/x").unwrap();
url/tests/debugger_visualizer.rs:80: assert_eq!(url_with_non_special_scheme.as_str(), "non-special://test/x");
url/tests/debugger_visualizer.rs:92: let url_with_base = base_url.join("/a%2fc").unwrap();
url/tests/debugger_visualizer.rs:95: let url_with_base_replaced = base_url.join("http://[::127.0.0.1]").unwrap();
url/tests/debugger_visualizer.rs:98: let url_with_comma = base_url.join("data:text/html,test#test").unwrap();
url/src/lib.rs:42:assert!(issue_list_url.path() == "/rust-lang/rust/issues");
url/src/lib.rs:46:assert!(&issue_list_url[Position::BeforePath..] == "/rust-lang/rust/issues?labels=E-easy&state=open");
url/src/lib.rs:48:assert!(!issue_list_url.cannot_be_a_base());
url/src/lib.rs:65:assert!(data_url.cannot_be_a_base());
url/src/lib.rs:67:assert!(data_url.path() == "text/plain,Hello");
url/src/lib.rs:104:let css_url = this_document.join("../main.css")?;
url/src/lib.rs:190: query_start: Option<u32>, // Before '?', unlike Position::QueryStart
url/src/lib.rs:191: fragment_start: Option<u32>, // Before '#', unlike Position::FragmentStart
url/src/lib.rs:327: if !self.cannot_be_a_base() {
url/src/lib.rs:367: /// let url = base.join("c.png")?;
url/src/lib.rs:371: /// let url = base.join("c.png")?;
url/src/lib.rs:386: pub fn join(&self, input: &str) -> Result<Url, crate::ParseError> {
url/src/lib.rs:432: if self.cannot_be_a_base() {
url/src/lib.rs:457: let (base_path, base_filename) = extract_path_filename(self.path());
url/src/lib.rs:458: let (url_path, url_filename) = extract_path_filename(url.path());
url/src/lib.rs:602: pub fn check_invariants(&self) -> Result<(), String> {
url/src/lib.rs:903: /// assert!(!url.cannot_be_a_base());
url/src/lib.rs:906: /// assert!(!url.cannot_be_a_base());
url/src/lib.rs:909: /// assert!(url.cannot_be_a_base());
url/src/lib.rs:915: pub fn cannot_be_a_base(&self) -> bool {
url/src/lib.rs:1252: /// assert_eq!(url.path(), "/api/versions");
url/src/lib.rs:1255: /// assert_eq!(url.path(), "/");
url/src/lib.rs:1258: /// assert_eq!(url.path(), "/countries/vi%E1%BB%87t%20nam");
url/src/lib.rs:1311: let path = self.path();
url/src/lib.rs:1464: self.strip_trailing_spaces_from_opaque_path();
url/src/lib.rs:1529: self.strip_trailing_spaces_from_opaque_path();
url/src/lib.rs:1610: /// assert_eq!(url.path(), "/api/comments");
url/src/lib.rs:1615: /// assert_eq!(url.path(), "/data/report.csv");
url/src/lib.rs:1621: /// assert_eq!(url.path(), "/api/some%20comments");
url/src/lib.rs:1627: /// assert_eq!(url.path(), "/api/some%20comments");
url/src/lib.rs:1634: let after_path = self.take_after_path();
url/src/lib.rs:1636: let cannot_be_a_base = self.cannot_be_a_base();
url/src/lib.rs:1640: if cannot_be_a_base {
url/src/lib.rs:1645: parser.parse_cannot_be_a_base_path(parser::Input::new(path));
url/src/lib.rs:1659: if self.cannot_be_a_base() {
url/src/lib.rs:1743: // has_host implies !cannot_be_a_base
url/src/lib.rs:1876: if self.cannot_be_a_base() {
url/src/lib.rs:2021: if self.cannot_be_a_base() {
url/src/lib.rs:2061: // has_host implies !cannot_be_a_base
url/src/lib.rs:2154: // has_host implies !cannot_be_a_base
url/src/lib.rs:2520: url.check_invariants().map_err(|reason| {
url/src/lib.rs:2538: /// let path = url.to_file_path();
url/src/lib.rs:2620: .field("cannot_be_a_base", &self.cannot_be_a_base())
url/src/lib.rs:2625: .field("path", &self.path())
url/src/lib.rs:2892: "to_file_path() failed to produce an absolute Path"
url/src/lib.rs:2954: "to_file_path() failed to produce an absolute Path"
url/src/parser.rs:372: } else if base_url.cannot_be_a_base() {
url/src/parser.rs:439: debug_assert!(!base_url.cannot_be_a_base());
url/src/parser.rs:454: SchemeType::NotSpecial => self.parse_non_special(input, scheme_type, scheme_end),
url/src/parser.rs:459: fn parse_non_special(
url/src/parser.rs:481: self.parse_cannot_be_a_base_path(input)
url/src/parser.rs:1330: pub fn parse_cannot_be_a_base_path<'i>(&mut self, mut input: Input<'i>) -> Input<'i> {
url/src/path_segments.rs:46: let after_path = url.take_after_path();
url/src/path_segments.rs:73: /// Remove all segments in the path, leaving the minimal `url.path() == "/"`.
url/src/path_segments.rs:101: /// unless it is also the initial slash (so this does nothing if `url.path() == "/")`.
url/src/path_segments.rs:137: /// If the path only has one segment, make it empty such that `url.path() == "/"`.
sed -n '1,190p' url/src/path_segments.rs
Chunk ID: caf744
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 1663
Output:
// Copyright 2016 The rust-url developers.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
use crate::parser::{self, to_u32, SchemeType};
use crate::Url;
use std::str;
/// Exposes methods to manipulate the path of an URL that is not cannot-be-base.
///
/// The path always starts with a `/` slash, and is made of slash-separated segments.
/// There is always at least one segment (which may be the empty string).
///
/// Examples:
///
/// ```rust
/// use url::Url;
/// # use std::error::Error;
///
/// # fn run() -> Result<(), Box<dyn Error>> {
/// let mut url = Url::parse("mailto:me@example.com")?;
/// assert!(url.path_segments_mut().is_err());
///
/// let mut url = Url::parse("http://example.net/foo/index.html")?;
/// url.path_segments_mut().map_err(|_| "cannot be base")?
/// .pop().push("img").push("2/100%.png");
/// assert_eq!(url.as_str(), "http://example.net/foo/img/2%2F100%25.png");
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
#[derive(Debug)]
pub struct PathSegmentsMut<'a> {
url: &'a mut Url,
after_first_slash: usize,
after_path: String,
old_after_path_position: u32,
}
// Not re-exported outside the crate
pub fn new(url: &mut Url) -> PathSegmentsMut<'_> {
let after_path = url.take_after_path();
let old_after_path_position = to_u32(url.serialization.len()).unwrap();
// Special urls always have a non empty path
if SchemeType::from(url.scheme()).is_special() {
debug_assert!(url.byte_at(url.path_start) == b'/');
} else {
debug_assert!(
url.serialization.len() == url.path_start as usize
|| url.byte_at(url.path_start) == b'/'
);
}
PathSegmentsMut {
after_first_slash: url.path_start as usize + "/".len(),
url,
old_after_path_position,
after_path,
}
}
impl<'a> Drop for PathSegmentsMut<'a> {
fn drop(&mut self) {
self.url
.restore_after_path(self.old_after_path_position, &self.after_path)
}
}
impl<'a> PathSegmentsMut<'a> {
/// Remove all segments in the path, leaving the minimal `url.path() == "/"`.
///
/// Returns `&mut Self` so that method calls can be chained.
///
/// Example:
///
/// ```rust
/// use url::Url;
/// # use std::error::Error;
///
/// # fn run() -> Result<(), Box<dyn Error>> {
/// let mut url = Url::parse("https://[code-host]/servo/rust-url/")?;
/// url.path_segments_mut().map_err(|_| "cannot be base")?
/// .clear().push("logout");
/// assert_eq!(url.as_str(), "https://[code-host]/logout");
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
pub fn clear(&mut self) -> &mut Self {
self.url.serialization.truncate(self.after_first_slash);
self
}
/// Remove the last segment of this URL’s path if it is empty,
/// except if these was only one segment to begin with.
///
/// In other words, remove one path trailing slash, if any,
/// unless it is also the initial slash (so this does nothing if `url.path() == "/")`.
///
/// Returns `&mut Self` so that method calls can be chained.
///
/// Example:
///
/// ```rust
/// use url::Url;
/// # use std::error::Error;
///
/// # fn run() -> Result<(), Box<dyn Error>> {
/// let mut url = Url::parse("https://[code-host]/servo/rust-url/")?;
/// url.path_segments_mut().map_err(|_| "cannot be base")?
/// .push("pulls");
/// assert_eq!(url.as_str(), "https://[code-host]/servo/rust-url//pulls");
///
/// let mut url = Url::parse("https://[code-host]/servo/rust-url/")?;
/// url.path_segments_mut().map_err(|_| "cannot be base")?
/// .pop_if_empty().push("pulls");
/// assert_eq!(url.as_str(), "https://[code-host]/servo/rust-url/pulls");
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
pub fn pop_if_empty(&mut self) -> &mut Self {
if self.after_first_slash >= self.url.serialization.len() {
return self;
}
if self.url.serialization[self.after_first_slash..].ends_with('/') {
self.url.serialization.pop();
}
self
}
/// Remove the last segment of this URL’s path.
///
/// If the path only has one segment, make it empty such that `url.path() == "/"`.
///
/// Returns `&mut Self` so that method calls can be chained.
pub fn pop(&mut self) -> &mut Self {
if self.after_first_slash >= self.url.serialization.len() {
return self;
}
let last_slash = self.url.serialization[self.after_first_slash..]
.rfind('/')
.unwrap_or(0);
self.url
.serialization
.truncate(self.after_first_slash + last_slash);
self
}
/// Append the given segment at the end of this URL’s path.
///
/// See the documentation for `.extend()`.
///
/// Returns `&mut Self` so that method calls can be chained.
pub fn push(&mut self, segment: &str) -> &mut Self {
self.extend(Some(segment))
}
/// Append each segment from the given iterator at the end of this URL’s path.
///
/// Each segment is percent-encoded like in `Url::parse` or `Url::join`,
/// except that `%` and `/` characters are also encoded (to `%25` and `%2F`).
/// This is unlike `Url::parse` where `%` is left as-is in case some of the input
/// is already percent-encoded, and `/` denotes a path segment separator.)
///
/// Note that, in addition to slashes between new segments,
/// this always adds a slash between the existing path and the new segments
/// *except* if the existing path is `"/"`.
/// If the previous last segment was empty (if the path had a trailing slash)
/// the path after `.extend()` will contain two consecutive slashes.
/// If that is undesired, call `.pop_if_empty()` first.
///
/// To obtain a behavior similar to `Url::join`, call `.pop()` unconditionally first.
///
/// Returns `&mut Self` so that method calls can be chained.
///
/// Example:
///
/// ```rust
/// use url::Url;
/// # use std::error::Error;
///
/// # fn run() -> Result<(), Box<dyn Error>> {
/// let mut url = Url::parse("https://[code-host]/")?;
/// let org = "servo";
/// let repo = "rust-url";
/// let issue_number = "188";
sed -n '1700,2005p' url/src/lib.rs
Chunk ID: 61273a
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 2632
Output:
/// url.set_port(None).map_err(|_| "cannot be base")?;
/// assert_eq!(url.as_str(), "ssh://example.net/");
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
///
/// Known default port numbers are not reflected:
///
/// ```rust
/// use url::Url;
/// # use std::error::Error;
///
/// # fn run() -> Result<(), Box<dyn Error>> {
/// let mut url = Url::parse("https://example.org/")?;
///
/// url.set_port(Some(443)).map_err(|_| "cannot be base")?;
/// assert!(url.port().is_none());
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
///
/// Cannot set port for cannot-be-a-base URLs:
///
/// ```
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let mut url = Url::parse("mailto:rms@example.net")?;
///
/// let result = url.set_port(Some(80));
/// assert!(result.is_err());
///
/// let result = url.set_port(None);
/// assert!(result.is_err());
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
#[allow(clippy::result_unit_err)]
pub fn set_port(&mut self, mut port: Option<u16>) -> Result<(), ()> {
// has_host implies !cannot_be_a_base
if !self.has_host() || self.host() == Some(Host::Domain("")) || self.scheme() == "file" {
return Err(());
}
if port.is_some() && port == parser::default_port(self.scheme()) {
port = None
}
self.set_port_internal(port);
Ok(())
}
fn set_port_internal(&mut self, port: Option<u16>) {
match (self.port, port) {
(None, None) => {}
(Some(_), None) => {
self.serialization
.drain(self.host_end as usize..self.path_start as usize);
let offset = self.path_start - self.host_end;
self.path_start = self.host_end;
if let Some(ref mut index) = self.query_start {
*index -= offset
}
if let Some(ref mut index) = self.fragment_start {
*index -= offset
}
}
(Some(old), Some(new)) if old == new => {}
(_, Some(new)) => {
let path_and_after = self.slice(self.path_start..).to_owned();
self.serialization.truncate(self.host_end as usize);
write!(&mut self.serialization, ":{}", new).unwrap();
let old_path_start = self.path_start;
let new_path_start = to_u32(self.serialization.len()).unwrap();
self.path_start = new_path_start;
let adjust = |index: &mut u32| {
*index -= old_path_start;
*index += new_path_start;
};
if let Some(ref mut index) = self.query_start {
adjust(index)
}
if let Some(ref mut index) = self.fragment_start {
adjust(index)
}
self.serialization.push_str(&path_and_after);
}
}
self.port = port;
}
/// Change this URL’s host.
///
/// Removing the host (calling this with `None`)
/// will also remove any username, password, and port number.
///
/// # Examples
///
/// Change host:
///
/// ```
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let mut url = Url::parse("https://example.net")?;
/// let result = url.set_host(Some("rust-lang.org"));
/// assert!(result.is_ok());
/// assert_eq!(url.as_str(), "https://rust-lang.org/");
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
///
/// Remove host:
///
/// ```
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let mut url = Url::parse("foo://example.net")?;
/// let result = url.set_host(None);
/// assert!(result.is_ok());
/// assert_eq!(url.as_str(), "foo:/");
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
///
/// Cannot remove host for 'special' schemes (e.g. `http`):
///
/// ```
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let mut url = Url::parse("https://example.net")?;
/// let result = url.set_host(None);
/// assert!(result.is_err());
/// assert_eq!(url.as_str(), "https://example.net/");
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
///
/// Cannot change or remove host for cannot-be-a-base URLs:
///
/// ```
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let mut url = Url::parse("mailto:rms@example.net")?;
///
/// let result = url.set_host(Some("rust-lang.org"));
/// assert!(result.is_err());
/// assert_eq!(url.as_str(), "mailto:rms@example.net");
///
/// let result = url.set_host(None);
/// assert!(result.is_err());
/// assert_eq!(url.as_str(), "mailto:rms@example.net");
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
///
/// # Errors
///
/// If this URL is cannot-be-a-base or there is an error parsing the given `host`,
/// a [`ParseError`] variant will be returned.
///
/// [`ParseError`]: enum.ParseError.html
pub fn set_host(&mut self, host: Option<&str>) -> Result<(), ParseError> {
if self.cannot_be_a_base() {
return Err(ParseError::SetHostOnCannotBeABaseUrl);
}
let scheme_type = SchemeType::from(self.scheme());
if let Some(host) = host {
if host.is_empty() && scheme_type.is_special() && !scheme_type.is_file() {
return Err(ParseError::EmptyHost);
}
let mut host_substr = host;
// Otherwise, if c is U+003A (:) and the [] flag is unset, then
if !host.starts_with('[') || !host.ends_with(']') {
match host.find(':') {
Some(0) => {
// If buffer is the empty string, validation error, return failure.
return Err(ParseError::InvalidDomainCharacter);
}
// Let host be the result of host parsing buffer
Some(colon_index) => {
host_substr = &host[..colon_index];
}
None => {}
}
}
if SchemeType::from(self.scheme()).is_special() {
self.set_host_internal(Host::parse(host_substr)?, None);
} else {
self.set_host_internal(Host::parse_opaque(host_substr)?, None);
}
} else if self.has_host() {
if scheme_type.is_special() && !scheme_type.is_file() {
return Err(ParseError::EmptyHost);
} else if self.serialization.len() == self.path_start as usize {
self.serialization.push('/');
}
debug_assert!(self.byte_at(self.scheme_end) == b':');
debug_assert!(self.byte_at(self.path_start) == b'/');
let new_path_start = if scheme_type.is_file() {
self.scheme_end + 3
} else {
self.scheme_end + 1
};
self.serialization
.drain(new_path_start as usize..self.path_start as usize);
let offset = self.path_start - new_path_start;
self.path_start = new_path_start;
self.username_end = new_path_start;
self.host_start = new_path_start;
self.host_end = new_path_start;
self.port = None;
if let Some(ref mut index) = self.query_start {
*index -= offset
}
if let Some(ref mut index) = self.fragment_start {
*index -= offset
}
}
Ok(())
}
/// opt_new_port: None means leave unchanged, Some(None) means remove any port number.
fn set_host_internal(&mut self, host: Host<String>, opt_new_port: Option<Option<u16>>) {
let old_suffix_pos = if opt_new_port.is_some() {
self.path_start
} else {
self.host_end
};
let suffix = self.slice(old_suffix_pos..).to_owned();
self.serialization.truncate(self.host_start as usize);
if !self.has_authority() {
debug_assert!(self.slice(self.scheme_end..self.host_start) == ":");
debug_assert!(self.username_end == self.host_start);
self.serialization.push('/');
self.serialization.push('/');
self.username_end += 2;
self.host_start += 2;
}
write!(&mut self.serialization, "{}", host).unwrap();
self.host_end = to_u32(self.serialization.len()).unwrap();
self.host = host.into();
if let Some(new_port) = opt_new_port {
self.port = new_port;
if let Some(port) = new_port {
write!(&mut self.serialization, ":{}", port).unwrap();
}
}
let new_suffix_pos = to_u32(self.serialization.len()).unwrap();
self.serialization.push_str(&suffix);
let adjust = |index: &mut u32| {
*index -= old_suffix_pos;
*index += new_suffix_pos;
};
adjust(&mut self.path_start);
if let Some(ref mut index) = self.query_start {
adjust(index)
}
if let Some(ref mut index) = self.fragment_start {
adjust(index)
}
}
/// Change this URL’s host to the given IP address.
///
/// If this URL is cannot-be-a-base, do nothing and return `Err`.
///
/// Compared to `Url::set_host`, this skips the host parser.
///
/// # Examples
///
/// ```rust
/// use url::{Url, ParseError};
///
/// # fn run() -> Result<(), ParseError> {
/// let mut url = Url::parse("http://example.com")?;
/// url.set_ip_host("127.0.0.1".parse().unwrap());
/// assert_eq!(url.host_str(), Some("127.0.0.1"));
/// assert_eq!(url.as_str(), "http://127.0.0.1/");
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
///
/// Cannot change URL's from mailto(cannot-be-base) to ip:
///
/// ```rust
sed -n '2005,2365p' url/src/lib.rs
Chunk ID: 2f4992
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 3270
Output:
/// ```rust
/// use url::{Url, ParseError};
///
/// # fn run() -> Result<(), ParseError> {
/// let mut url = Url::parse("mailto:rms@example.com")?;
/// let result = url.set_ip_host("127.0.0.1".parse().unwrap());
///
/// assert_eq!(url.as_str(), "mailto:rms@example.com");
/// assert!(result.is_err());
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
///
#[allow(clippy::result_unit_err)]
pub fn set_ip_host(&mut self, address: IpAddr) -> Result<(), ()> {
if self.cannot_be_a_base() {
return Err(());
}
let address = match address {
IpAddr::V4(address) => Host::Ipv4(address),
IpAddr::V6(address) => Host::Ipv6(address),
};
self.set_host_internal(address, None);
Ok(())
}
/// Change this URL’s password.
///
/// If this URL is cannot-be-a-base or does not have a host, do nothing and return `Err`.
///
/// # Examples
///
/// ```rust
/// use url::{Url, ParseError};
///
/// # fn run() -> Result<(), ParseError> {
/// let mut url = Url::parse("mailto:rmz@example.com")?;
/// let result = url.set_password(Some("secret_password"));
/// assert!(result.is_err());
///
/// let mut url = Url::parse("ftp://user1:secret1@example.com")?;
/// let result = url.set_password(Some("secret_password"));
/// assert_eq!(url.password(), Some("secret_password"));
///
/// let mut url = Url::parse("ftp://user2:@example.com")?;
/// let result = url.set_password(Some("secret2"));
/// assert!(result.is_ok());
/// assert_eq!(url.password(), Some("secret2"));
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
#[allow(clippy::result_unit_err)]
pub fn set_password(&mut self, password: Option<&str>) -> Result<(), ()> {
// has_host implies !cannot_be_a_base
if !self.has_host() || self.host() == Some(Host::Domain("")) || self.scheme() == "file" {
return Err(());
}
if let Some(password) = password {
let host_and_after = self.slice(self.host_start..).to_owned();
self.serialization.truncate(self.username_end as usize);
self.serialization.push(':');
self.serialization
.extend(utf8_percent_encode(password, USERINFO));
self.serialization.push('@');
let old_host_start = self.host_start;
let new_host_start = to_u32(self.serialization.len()).unwrap();
let adjust = |index: &mut u32| {
*index -= old_host_start;
*index += new_host_start;
};
self.host_start = new_host_start;
adjust(&mut self.host_end);
adjust(&mut self.path_start);
if let Some(ref mut index) = self.query_start {
adjust(index)
}
if let Some(ref mut index) = self.fragment_start {
adjust(index)
}
self.serialization.push_str(&host_and_after);
} else if self.byte_at(self.username_end) == b':' {
// If there is a password to remove
let has_username_or_password = self.byte_at(self.host_start - 1) == b'@';
debug_assert!(has_username_or_password);
let username_start = self.scheme_end + 3;
let empty_username = username_start == self.username_end;
let start = self.username_end; // Remove the ':'
let end = if empty_username {
self.host_start // Remove the '@' as well
} else {
self.host_start - 1 // Keep the '@' to separate the username from the host
};
self.serialization.drain(start as usize..end as usize);
let offset = end - start;
self.host_start -= offset;
self.host_end -= offset;
self.path_start -= offset;
if let Some(ref mut index) = self.query_start {
*index -= offset
}
if let Some(ref mut index) = self.fragment_start {
*index -= offset
}
}
Ok(())
}
/// Change this URL’s username.
///
/// If this URL is cannot-be-a-base or does not have a host, do nothing and return `Err`.
/// # Examples
///
/// Cannot setup username from mailto(cannot-be-base)
///
/// ```rust
/// use url::{Url, ParseError};
///
/// # fn run() -> Result<(), ParseError> {
/// let mut url = Url::parse("mailto:rmz@example.com")?;
/// let result = url.set_username("user1");
/// assert_eq!(url.as_str(), "mailto:rmz@example.com");
/// assert!(result.is_err());
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
///
/// Setup username to user1
///
/// ```rust
/// use url::{Url, ParseError};
///
/// # fn run() -> Result<(), ParseError> {
/// let mut url = Url::parse("ftp://:secre1@example.com/")?;
/// let result = url.set_username("user1");
/// assert!(result.is_ok());
/// assert_eq!(url.username(), "user1");
/// assert_eq!(url.as_str(), "ftp://user1:secre1@example.com/");
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
#[allow(clippy::result_unit_err)]
pub fn set_username(&mut self, username: &str) -> Result<(), ()> {
// has_host implies !cannot_be_a_base
if !self.has_host() || self.host() == Some(Host::Domain("")) || self.scheme() == "file" {
return Err(());
}
let username_start = self.scheme_end + 3;
debug_assert!(self.slice(self.scheme_end..username_start) == "://");
if self.slice(username_start..self.username_end) == username {
return Ok(());
}
let after_username = self.slice(self.username_end..).to_owned();
self.serialization.truncate(username_start as usize);
self.serialization
.extend(utf8_percent_encode(username, USERINFO));
let mut removed_bytes = self.username_end;
self.username_end = to_u32(self.serialization.len()).unwrap();
let mut added_bytes = self.username_end;
let new_username_is_empty = self.username_end == username_start;
match (new_username_is_empty, after_username.chars().next()) {
(true, Some('@')) => {
removed_bytes += 1;
self.serialization.push_str(&after_username[1..]);
}
(false, Some('@')) | (_, Some(':')) | (true, _) => {
self.serialization.push_str(&after_username);
}
(false, _) => {
added_bytes += 1;
self.serialization.push('@');
self.serialization.push_str(&after_username);
}
}
let adjust = |index: &mut u32| {
*index -= removed_bytes;
*index += added_bytes;
};
adjust(&mut self.host_start);
adjust(&mut self.host_end);
adjust(&mut self.path_start);
if let Some(ref mut index) = self.query_start {
adjust(index)
}
if let Some(ref mut index) = self.fragment_start {
adjust(index)
}
Ok(())
}
/// Change this URL’s scheme.
///
/// Do nothing and return `Err` under the following circumstances:
///
/// * If the new scheme is not in `[a-zA-Z][a-zA-Z0-9+.-]+`
/// * If this URL is cannot-be-a-base and the new scheme is one of
/// `http`, `https`, `ws`, `wss` or `ftp`
/// * If either the old or new scheme is `http`, `https`, `ws`,
/// `wss` or `ftp` and the other is not one of these
/// * If the new scheme is `file` and this URL includes credentials
/// or has a non-null port
/// * If this URL's scheme is `file` and its host is empty or null
///
/// See also [the URL specification's section on legal scheme state
/// overrides](https://url.spec.whatwg.org/#scheme-state).
///
/// # Examples
///
/// Change the URL’s scheme from `https` to `http`:
///
/// ```
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let mut url = Url::parse("https://example.net")?;
/// let result = url.set_scheme("http");
/// assert_eq!(url.as_str(), "http://example.net/");
/// assert!(result.is_ok());
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
/// Change the URL’s scheme from `foo` to `bar`:
///
/// ```
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let mut url = Url::parse("foo://example.net")?;
/// let result = url.set_scheme("bar");
/// assert_eq!(url.as_str(), "bar://example.net");
/// assert!(result.is_ok());
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
///
/// Cannot change URL’s scheme from `https` to `foõ`:
///
/// ```
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let mut url = Url::parse("https://example.net")?;
/// let result = url.set_scheme("foõ");
/// assert_eq!(url.as_str(), "https://example.net/");
/// assert!(result.is_err());
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
///
/// Cannot change URL’s scheme from `mailto` (cannot-be-a-base) to `https`:
///
/// ```
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let mut url = Url::parse("mailto:rms@example.net")?;
/// let result = url.set_scheme("https");
/// assert_eq!(url.as_str(), "mailto:rms@example.net");
/// assert!(result.is_err());
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
/// Cannot change the URL’s scheme from `foo` to `https`:
///
/// ```
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let mut url = Url::parse("foo://example.net")?;
/// let result = url.set_scheme("https");
/// assert_eq!(url.as_str(), "foo://example.net");
/// assert!(result.is_err());
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
/// Cannot change the URL’s scheme from `http` to `foo`:
///
/// ```
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let mut url = Url::parse("http://example.net")?;
/// let result = url.set_scheme("foo");
/// assert_eq!(url.as_str(), "http://example.net/");
/// assert!(result.is_err());
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
#[allow(clippy::result_unit_err, clippy::suspicious_operation_groupings)]
pub fn set_scheme(&mut self, scheme: &str) -> Result<(), ()> {
let mut parser = Parser::for_setter(String::new());
let remaining = parser.parse_scheme(parser::Input::new(scheme))?;
let new_scheme_type = SchemeType::from(&parser.serialization);
let old_scheme_type = SchemeType::from(self.scheme());
// If url’s scheme is a special scheme and buffer is not a special scheme, then return.
if (new_scheme_type.is_special() && !old_scheme_type.is_special()) ||
// If url’s scheme is not a special scheme and buffer is a special scheme, then return.
(!new_scheme_type.is_special() && old_scheme_type.is_special()) ||
// If url includes credentials or has a non-null port, and buffer is "file", then return.
// If url’s scheme is "file" and its host is an empty host or null, then return.
(new_scheme_type.is_file() && self.has_authority())
{
return Err(());
}
if !remaining.is_empty() || (!self.has_host() && new_scheme_type.is_special()) {
return Err(());
}
let old_scheme_end = self.scheme_end;
let new_scheme_end = to_u32(parser.serialization.len()).unwrap();
let adjust = |index: &mut u32| {
*index -= old_scheme_end;
*index += new_scheme_end;
};
self.scheme_end = new_scheme_end;
adjust(&mut self.username_end);
adjust(&mut self.host_start);
adjust(&mut self.host_end);
adjust(&mut self.path_start);
if let Some(ref mut index) = self.query_start {
adjust(index)
}
if let Some(ref mut index) = self.fragment_start {
adjust(index)
}
parser.serialization.push_str(self.slice(old_scheme_end..));
self.serialization = parser.serialization;
// Update the port so it can be removed
// If it is the scheme's default
// we don't mind it silently failing
// if there was no port in the first place
let previous_port = self.port();
let _ = self.set_port(previous_port);
Ok(())
}
sed -n '190,360p' url/src/path_segments.rs
Chunk ID: 33842f
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 514
Output:
/// let issue_number = "188";
/// url.path_segments_mut().map_err(|_| "cannot be base")?
/// .extend(&[org, repo, "issues", issue_number]);
/// assert_eq!(url.as_str(), "https://[code-host]/servo/rust-url/issues/188");
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
///
/// In order to make sure that parsing the serialization of an URL gives the same URL,
/// a segment is ignored if it is `"."` or `".."`:
///
/// ```rust
/// use url::Url;
/// # use std::error::Error;
///
/// # fn run() -> Result<(), Box<dyn Error>> {
/// let mut url = Url::parse("https://[code-host]/servo")?;
/// url.path_segments_mut().map_err(|_| "cannot be base")?
/// .extend(&["..", "rust-url", ".", "pulls"]);
/// assert_eq!(url.as_str(), "https://[code-host]/servo/rust-url/pulls");
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
pub fn extend<I>(&mut self, segments: I) -> &mut Self
where
I: IntoIterator,
I::Item: AsRef<str>,
{
let scheme_type = SchemeType::from(self.url.scheme());
let path_start = self.url.path_start as usize;
self.url.mutate(|parser| {
parser.context = parser::Context::PathSegmentSetter;
for segment in segments {
let segment = segment.as_ref();
if matches!(segment, "." | "..") {
continue;
}
if parser.serialization.len() > path_start + 1
// Non special url's path might still be empty
|| parser.serialization.len() == path_start
{
parser.serialization.push('/');
}
let mut has_host = true; // FIXME account for this?
parser.parse_path(
scheme_type,
&mut has_host,
path_start,
parser::Input::new(segment),
);
}
});
self
}
}
sed -n '120,170p' url/src/parser.rs
Chunk ID: 05700c
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 386
Output:
}
syntax_violation_enum! {
Backslash => "backslash",
C0SpaceIgnored =>
"leading or trailing control or space character are ignored in URLs",
EmbeddedCredentials =>
"embedding authentication information (username or password) \
in an URL is not recommended",
ExpectedDoubleSlash => "expected //",
ExpectedFileDoubleSlash => "expected // after file:",
FileWithHostAndWindowsDrive => "file: with host and Windows drive letter",
NonUrlCodePoint => "non-URL code point",
NullInFragment => "NULL characters are ignored in URL fragment identifiers",
PercentDecode => "expected 2 hex digits after %",
TabOrNewlineIgnored => "tabs or newlines are ignored in URLs",
UnencodedAtSign => "unencoded @ sign in username or password",
}
impl fmt::Display for SyntaxViolation {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
fmt::Display::fmt(self.description(), f)
}
}
#[derive(Copy, Clone, PartialEq, Eq)]
pub enum SchemeType {
File,
SpecialNotFile,
NotSpecial,
}
impl SchemeType {
pub fn is_special(&self) -> bool {
!matches!(*self, SchemeType::NotSpecial)
}
pub fn is_file(&self) -> bool {
matches!(*self, SchemeType::File)
}
pub fn from(s: &str) -> Self {
match s {
"http" | "https" | "ws" | "wss" | "ftp" => SchemeType::SpecialNotFile,
"file" => SchemeType::File,
_ => SchemeType::NotSpecial,
}
}
}
pub fn default_port(scheme: &str) -> Option<u16> {
rg -n "enum HostInternal|struct HostInternal|impl From<Host|HostInternal" url/src/lib.rs
Chunk ID: 0b3840
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 266
Output:
136:use crate::host::HostInternal;
187: host: HostInternal,
653: HostInternal::None => assert_eq!(host_str, ""),
654: HostInternal::Ipv4(address) => assert_eq!(host_str, address.to_string()),
655: HostInternal::Ipv6(address) => {
659: HostInternal::Domain => {
684: assert_eq!(self.host, HostInternal::None);
1010: !matches!(self.host, HostInternal::None)
1087: HostInternal::None => None,
1088: HostInternal::Domain => Some(Host::Domain(self.slice(self.host_start..self.host_end))),
1089: HostInternal::Ipv4(address) => Some(Host::Ipv4(address)),
1090: HostInternal::Ipv6(address) => Some(Host::Ipv6(address)),
1119: HostInternal::Domain => Some(self.slice(self.host_start..self.host_end)),
2755:) -> Result<(u32, HostInternal), ()> {
2778: Ok((host_end, HostInternal::None))
2785:) -> Result<(u32, HostInternal), ()> {
2794:) -> Result<(u32, HostInternal), ()> {
2809: host_internal = HostInternal::None;
sed -n '1,90p' url/src/host.rs
Chunk ID: 701471
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 810
Output:
// Copyright 2013-2016 The rust-url developers.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
use std::cmp;
use std::fmt::{self, Formatter};
use std::net::{Ipv4Addr, Ipv6Addr};
use percent_encoding::{percent_decode, utf8_percent_encode, CONTROLS};
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use crate::parser::{ParseError, ParseResult};
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub(crate) enum HostInternal {
None,
Domain,
Ipv4(Ipv4Addr),
Ipv6(Ipv6Addr),
}
impl From<Host<String>> for HostInternal {
fn from(host: Host<String>) -> HostInternal {
match host {
Host::Domain(ref s) if s.is_empty() => HostInternal::None,
Host::Domain(_) => HostInternal::Domain,
Host::Ipv4(address) => HostInternal::Ipv4(address),
Host::Ipv6(address) => HostInternal::Ipv6(address),
}
}
}
/// The host name of an URL.
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
#[derive(Clone, Debug, Eq, Ord, PartialOrd, Hash)]
pub enum Host<S = String> {
/// A DNS domain name, as '.' dot-separated labels.
/// Non-ASCII labels are encoded in punycode per IDNA if this is the host of
/// a special URL, or percent encoded for non-special URLs. Hosts for
/// non-special URLs are also called opaque hosts.
Domain(S),
/// An IPv4 address.
/// `Url::host_str` returns the serialization of this address,
/// as four decimal integers separated by `.` dots.
Ipv4(Ipv4Addr),
/// An IPv6 address.
/// `Url::host_str` returns the serialization of that address between `[` and `]` brackets,
/// in the format per [RFC 5952 *A Recommendation
/// for IPv6 Address Text Representation*](https://tools.ietf.org/html/rfc5952):
/// lowercase hexadecimal with maximal `::` compression.
Ipv6(Ipv6Addr),
}
impl<'a> Host<&'a str> {
/// Return a copy of `self` that owns an allocated `String` but does not borrow an `&Url`.
pub fn to_owned(&self) -> Host<String> {
match *self {
Host::Domain(domain) => Host::Domain(domain.to_owned()),
Host::Ipv4(address) => Host::Ipv4(address),
Host::Ipv6(address) => Host::Ipv6(address),
}
}
}
impl Host<String> {
/// Parse a host: either an IPv6 address in [] square brackets, or a domain.
///
/// <https://url.spec.whatwg.org/#host-parsing>
pub fn parse(input: &str) -> Result<Self, ParseError> {
if input.starts_with('[') {
if !input.ends_with(']') {
return Err(ParseError::InvalidIpv6Address);
}
return parse_ipv6addr(&input[1..input.len() - 1]).map(Host::Ipv6);
}
let domain = percent_decode(input.as_bytes()).decode_utf8_lossy();
let domain = Self::domain_to_ascii(&domain)?;
if domain.is_empty() {
return Err(ParseError::EmptyHost);
}
*** Begin Patch
*** Update File: /app/url/src/lib.rs
@@
pub fn check_invariants(&self) -> Result<(), String> {
@@
- if self.slice(self.scheme_end + 1..).starts_with("//") {
+ if self.has_authority() {
@@
} else {
// Anarchist URL (no authority)
assert_eq!(self.username_end, self.scheme_end + 1);
assert_eq!(self.host_start, self.scheme_end + 1);
assert_eq!(self.host_end, self.scheme_end + 1);
assert_eq!(self.host, HostInternal::None);
assert_eq!(self.port, None);
- assert_eq!(self.path_start, self.scheme_end + 1);
+ if self.has_no_authority_path_marker() {
+ assert_eq!(self.path_start, self.scheme_end + 3);
+ assert_eq!(self.slice(self.scheme_end + 1..self.path_start), "/.");
+ assert!(self.path().starts_with("//"));
+ } else {
+ assert_eq!(self.path_start, self.scheme_end + 1);
+ }
}
@@
Ok(())
}
+
+ pub(crate) fn has_no_authority_path_marker(&self) -> bool {
+ SchemeType::from(self.scheme()) == SchemeType::NotSpecial
+ && self.is_no_authority()
+ && self.path_start >= self.scheme_end + 3
+ && self.slice(self.path_start - 2..self.path_start) == "/."
+ }
+
+ pub(crate) fn path_start_before_marker(&self) -> u32 {
+ if self.has_no_authority_path_marker() {
+ self.path_start - 2
+ } else {
+ self.path_start
+ }
+ }
+
+ pub(crate) fn normalize_no_authority_path_marker(&mut self) {
+ if SchemeType::from(self.scheme()) != SchemeType::NotSpecial || !self.is_no_authority() {
+ return;
+ }
+
+ let has_marker = self.has_no_authority_path_marker();
+ let should_have_marker = self.path().starts_with("//");
+ match (has_marker, should_have_marker) {
+ (false, true) => {
+ let marker_start = self.path_start;
+ self.serialization.insert_str(marker_start as usize, "/.");
+ self.path_start += 2;
+ if let Some(ref mut index) = self.query_start {
+ *index += 2
+ }
+ if let Some(ref mut index) = self.fragment_start {
+ *index += 2
+ }
+ }
+ (true, false) => {
+ let marker_start = self.path_start - 2;
+ self.serialization
+ .drain(marker_start as usize..self.path_start as usize);
+ self.path_start -= 2;
+ if let Some(ref mut index) = self.query_start {
+ *index -= 2
+ }
+ if let Some(ref mut index) = self.fragment_start {
+ *index -= 2
+ }
+ }
+ _ => {}
+ }
+ }
@@
pub fn has_authority(&self) -> bool {
debug_assert!(self.byte_at(self.scheme_end) == b':');
self.slice(self.scheme_end..).starts_with("://")
}
+
+ fn is_no_authority(&self) -> bool {
+ self.username_end == self.scheme_end + 1
+ && self.host_start == self.scheme_end + 1
+ && self.host_end == self.scheme_end + 1
+ && self.host == HostInternal::None
+ && self.port.is_none()
+ }
@@
let cannot_be_a_base = self.cannot_be_a_base();
let scheme_type = SchemeType::from(self.scheme());
- self.serialization.truncate(self.path_start as usize);
+ self.serialization
+ .truncate(self.path_start_before_marker() as usize);
+ self.path_start = self.path_start_before_marker();
self.mutate(|parser| {
if cannot_be_a_base {
if path.starts_with('/') {
@@
parser.parse_path_start(scheme_type, &mut has_host, parser::Input::new(path));
}
});
+ self.normalize_no_authority_path_marker();
self.restore_after_path(old_after_path_pos, &after_path);
}
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M /app/url/src/lib.rs
*** Begin Patch
*** Update File: /app/url/src/parser.rs
@@
- let path_start = base_url.path_start;
- self.serialization.push_str(base_url.slice(..path_start));
+ let path_start = base_url.path_start_before_marker();
+ self.serialization.push_str(base_url.slice(..path_start));
self.serialization.push('/');
let remaining = self.parse_path(
scheme_type,
&mut true,
@@
- base_url.path_start,
+ path_start,
remaining,
)
}
_ => {
- let before_query = match (base_url.query_start, base_url.fragment_start) {
- (None, None) => &*base_url.serialization,
- (Some(i), _) | (None, Some(i)) => base_url.slice(..i),
- };
- self.serialization.push_str(before_query);
+ let path_start = base_url.path_start_before_marker();
+ self.serialization.push_str(base_url.slice(..path_start));
+ self.serialization.push_str(base_url.path());
// FIXME spec says just "remove last entry", not the "pop" algorithm
- self.pop_path(scheme_type, base_url.path_start as usize);
+ self.pop_path(scheme_type, path_start as usize);
// A special url always has a path.
// A path always starts with '/'
- if self.serialization.len() == base_url.path_start as usize
+ if self.serialization.len() == path_start as usize
&& (SchemeType::from(base_url.scheme()).is_special() || !input.is_empty())
{
self.serialization.push('/');
}
let remaining = match input.split_first() {
(Some('/'), remaining) => self.parse_path(
scheme_type,
&mut true,
- base_url.path_start as usize,
+ path_start as usize,
remaining,
),
_ => {
- self.parse_path(scheme_type, &mut true, base_url.path_start as usize, input)
+ self.parse_path(scheme_type, &mut true, path_start as usize, input)
}
};
self.with_query_and_fragment(
scheme_type,
@@
- base_url.path_start,
+ path_start,
remaining,
)
}
}
}
@@
- path_start: u32,
+ mut path_start: u32,
remaining: Input<'_>,
) -> ParseResult<Url> {
+ if scheme_type == SchemeType::NotSpecial
+ && username_end == scheme_end + 1
+ && host_start == scheme_end + 1
+ && host_end == scheme_end + 1
+ && host == HostInternal::None
+ && port.is_none()
+ && self.serialization[path_start as usize..].starts_with("//")
+ {
+ self.serialization.insert_str(path_start as usize, "/.");
+ path_start += 2;
+ }
let (query_start, fragment_start) =
self.parse_query_and_fragment(scheme_type, scheme_end, remaining)?;
Ok(Url {
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M /app/url/src/parser.rs
sed -n '300,330p' url/src/parser.rs && sed -n '130,150p' url/src/lib.rs
Chunk ID: b063bb
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 308
Output:
}
}
true
}
}
impl<F: FnMut(char) -> bool> Pattern for F {
fn split_prefix(self, input: &mut Input) -> bool {
input.next().map_or(false, self)
}
}
impl<'i> Iterator for Input<'i> {
type Item = char;
fn next(&mut self) -> Option<char> {
self.chars
.by_ref()
.find(|&c| !matches!(c, '\t' | '\n' | '\r'))
}
}
pub struct Parser<'a> {
pub serialization: String,
pub base_url: Option<&'a Url>,
pub query_encoding_override: EncodingOverride<'a>,
pub violation_fn: Option<&'a dyn Fn(SyntaxViolation)>,
pub context: Context,
}
#[derive(PartialEq, Eq, Copy, Clone)]
pub enum Context {
pub use form_urlencoded;
#[cfg(feature = "serde")]
extern crate serde;
use crate::host::HostInternal;
use crate::parser::{to_u32, Context, Parser, SchemeType, PATH_SEGMENT, USERINFO};
use percent_encoding::{percent_decode, percent_encode, utf8_percent_encode};
use std::borrow::Borrow;
use std::cmp;
use std::fmt::{self, Write};
use std::hash;
use std::io;
use std::mem;
use std::net::{IpAddr, SocketAddr, ToSocketAddrs};
use std::ops::{Range, RangeFrom, RangeTo};
use std::path::{Path, PathBuf};
use std::str;
use std::convert::TryFrom;
sed -n '1,35p' url/src/parser.rs
Chunk ID: 9bf641
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 287
Output:
// Copyright 2013-2016 The rust-url developers.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
use std::error::Error;
use std::fmt::{self, Formatter, Write};
use std::str;
use crate::host::{Host, HostInternal};
use crate::Url;
use form_urlencoded::EncodingOverride;
use percent_encoding::{percent_encode, utf8_percent_encode, AsciiSet, CONTROLS};
/// https://url.spec.whatwg.org/#fragment-percent-encode-set
const FRAGMENT: &AsciiSet = &CONTROLS.add(b' ').add(b'"').add(b'<').add(b'>').add(b'`');
/// https://url.spec.whatwg.org/#path-percent-encode-set
const PATH: &AsciiSet = &FRAGMENT.add(b'#').add(b'?').add(b'{').add(b'}');
/// https://url.spec.whatwg.org/#userinfo-percent-encode-set
pub(crate) const USERINFO: &AsciiSet = &PATH
.add(b'/')
.add(b':')
.add(b';')
.add(b'=')
.add(b'@')
.add(b'[')
.add(b'\\')
.add(b']')
.add(b'^')
.add(b'|');
*** Begin Patch
*** Update File: /app/url/src/slicing.rs
@@
- Position::AfterPort => self.path_start as usize,
+ Position::AfterPort => self.path_start_before_marker() as usize,
Position::BeforePath => self.path_start as usize,
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M /app/url/src/slicing.rs
*** Begin Patch
*** Update File: /app/url/src/path_segments.rs
@@
impl<'a> Drop for PathSegmentsMut<'a> {
fn drop(&mut self) {
+ self.url.normalize_no_authority_path_marker();
self.url
.restore_after_path(self.old_after_path_position, &self.after_path)
}
}
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M /app/url/src/path_segments.rs
sed -n '880,980p' url/tests/unit.rs && sed -n '960,1015p' url/tests/unit.rs
Chunk ID: 8b27c8
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 1147
Output:
/// https://[code-host]/servo/rust-url/issues/505
#[cfg(windows)]
#[test]
fn test_url_from_file_path() {
use std::path::PathBuf;
use url::Url;
let p = PathBuf::from("c:///");
let u = Url::from_file_path(p).unwrap();
let path = u.to_file_path().unwrap();
assert_eq!("C:\\", path.to_str().unwrap());
}
/// https://[code-host]/servo/rust-url/issues/505
#[cfg(not(windows))]
#[test]
fn test_url_from_file_path() {
use std::path::PathBuf;
use url::Url;
let p = PathBuf::from("/c:/");
let u = Url::from_file_path(p).unwrap();
let path = u.to_file_path().unwrap();
assert_eq!("/c:/", path.to_str().unwrap());
}
#[test]
fn test_non_special_path() {
let mut db_url = url::Url::parse("postgres://postgres@localhost/").unwrap();
assert_eq!(db_url.as_str(), "postgres://postgres@localhost/");
db_url.set_path("diesel_foo");
assert_eq!(db_url.as_str(), "postgres://postgres@localhost/diesel_foo");
assert_eq!(db_url.path(), "/diesel_foo");
}
#[test]
fn test_non_special_path2() {
let mut db_url = url::Url::parse("postgres://postgres@localhost/").unwrap();
assert_eq!(db_url.as_str(), "postgres://postgres@localhost/");
db_url.set_path("");
assert_eq!(db_url.path(), "");
assert_eq!(db_url.as_str(), "postgres://postgres@localhost");
db_url.set_path("foo");
assert_eq!(db_url.path(), "/foo");
assert_eq!(db_url.as_str(), "postgres://postgres@localhost/foo");
db_url.set_path("/bar");
assert_eq!(db_url.path(), "/bar");
assert_eq!(db_url.as_str(), "postgres://postgres@localhost/bar");
}
#[test]
fn test_non_special_path3() {
let mut db_url = url::Url::parse("postgres://postgres@localhost/").unwrap();
assert_eq!(db_url.as_str(), "postgres://postgres@localhost/");
db_url.set_path("/");
assert_eq!(db_url.as_str(), "postgres://postgres@localhost/");
assert_eq!(db_url.path(), "/");
db_url.set_path("/foo");
assert_eq!(db_url.as_str(), "postgres://postgres@localhost/foo");
assert_eq!(db_url.path(), "/foo");
}
#[test]
fn test_set_scheme_to_file_with_host() {
let mut url: Url = "http://localhost:6767/foo/bar".parse().unwrap();
let result = url.set_scheme("file");
assert_eq!(url.to_string(), "http://localhost:6767/foo/bar");
assert_eq!(result, Err(()));
}
#[test]
fn no_panic() {
let mut url = Url::parse("arhttpsps:/.//eom/dae.com/\\\\t\\:").unwrap();
url::quirks::set_hostname(&mut url, "//eom/datcom/\\\\t\\://eom/data.cs").unwrap();
}
#[test]
fn pop_if_empty_in_bounds() {
let mut url = Url::parse("m://").unwrap();
let mut segments = url.path_segments_mut().unwrap();
segments.pop_if_empty();
segments.pop();
}
#[test]
fn test_slicing() {
use url::Position::*;
#[derive(Default)]
struct ExpectedSlices<'a> {
full: &'a str,
scheme: &'a str,
username: &'a str,
password: &'a str,
host: &'a str,
port: &'a str,
path: &'a str,
query: &'a str,
fragment: &'a str,
}
let mut segments = url.path_segments_mut().unwrap();
segments.pop_if_empty();
segments.pop();
}
#[test]
fn test_slicing() {
use url::Position::*;
#[derive(Default)]
struct ExpectedSlices<'a> {
full: &'a str,
scheme: &'a str,
username: &'a str,
password: &'a str,
host: &'a str,
port: &'a str,
path: &'a str,
query: &'a str,
fragment: &'a str,
}
let data = [
ExpectedSlices {
full: "https://user:pass@domain.com:9742/path/file.ext?key=val&key2=val2#fragment",
scheme: "https",
username: "user",
password: "pass",
host: "domain.com",
port: "9742",
path: "/path/file.ext",
query: "key=val&key2=val2",
fragment: "fragment",
},
ExpectedSlices {
full: "https://domain.com:9742/path/file.ext#fragment",
scheme: "https",
host: "domain.com",
port: "9742",
path: "/path/file.ext",
fragment: "fragment",
..Default::default()
},
ExpectedSlices {
full: "https://domain.com:9742/path/file.ext",
scheme: "https",
host: "domain.com",
port: "9742",
path: "/path/file.ext",
..Default::default()
},
ExpectedSlices {
full: "blob:blob-info",
scheme: "blob",
path: "blob-info",
..Default::default()
sed -n '1015,1110p' url/tests/unit.rs
Chunk ID: 81ab5e
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 710
Output:
..Default::default()
},
];
for expected_slices in &data {
let url = Url::parse(expected_slices.full).unwrap();
assert_eq!(&url[..], expected_slices.full);
assert_eq!(&url[BeforeScheme..AfterScheme], expected_slices.scheme);
assert_eq!(
&url[BeforeUsername..AfterUsername],
expected_slices.username
);
assert_eq!(
&url[BeforePassword..AfterPassword],
expected_slices.password
);
assert_eq!(&url[BeforeHost..AfterHost], expected_slices.host);
assert_eq!(&url[BeforePort..AfterPort], expected_slices.port);
assert_eq!(&url[BeforePath..AfterPath], expected_slices.path);
assert_eq!(&url[BeforeQuery..AfterQuery], expected_slices.query);
assert_eq!(
&url[BeforeFragment..AfterFragment],
expected_slices.fragment
);
assert_eq!(&url[..AfterFragment], expected_slices.full);
}
}
#[test]
fn test_make_relative() {
let tests = [
(
"http://127.0.0.1:8080/test",
"http://127.0.0.1:8080/test",
"",
),
(
"http://127.0.0.1:8080/test",
"http://127.0.0.1:8080/test/",
"test/",
),
(
"http://127.0.0.1:8080/test/",
"http://127.0.0.1:8080/test",
"../test",
),
(
"http://127.0.0.1:8080/",
"http://127.0.0.1:8080/?foo=bar#123",
"?foo=bar#123",
),
(
"http://127.0.0.1:8080/",
"http://127.0.0.1:8080/test/video",
"test/video",
),
(
"http://127.0.0.1:8080/test",
"http://127.0.0.1:8080/test/video",
"test/video",
),
(
"http://127.0.0.1:8080/test/",
"http://127.0.0.1:8080/test/video",
"video",
),
(
"http://127.0.0.1:8080/test",
"http://127.0.0.1:8080/test2/video",
"test2/video",
),
(
"http://127.0.0.1:8080/test/",
"http://127.0.0.1:8080/test2/video",
"../test2/video",
),
(
"http://127.0.0.1:8080/test/bla",
"http://127.0.0.1:8080/test2/video",
"../test2/video",
),
(
"http://127.0.0.1:8080/test/bla/",
"http://127.0.0.1:8080/test2/video",
"../../test2/video",
),
(
"http://127.0.0.1:8080/test/?foo=bar#123",
"http://127.0.0.1:8080/test/video",
"video",
),
(
"http://127.0.0.1:8080/test/",
"http://127.0.0.1:8080/test/video?baz=meh#456",
"video?baz=meh#456",
),
sed -n '1,40p' url/tests/unit.rs
Chunk ID: eddd30
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 297
Output:
// Copyright 2013-2014 The rust-url developers.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
//! Unit tests
use std::borrow::Cow;
use std::cell::{Cell, RefCell};
use std::net::{Ipv4Addr, Ipv6Addr};
use std::path::{Path, PathBuf};
use url::{form_urlencoded, Host, Origin, Url};
#[test]
fn size() {
use std::mem::size_of;
assert_eq!(size_of::<Url>(), size_of::<Option<Url>>());
}
#[test]
fn test_relative() {
let base: Url = "sc://%C3%B1".parse().unwrap();
let url = base.join("/resources/testharness.js").unwrap();
assert_eq!(url.as_str(), "sc://%C3%B1/resources/testharness.js");
}
#[test]
fn test_relative_empty() {
let base: Url = "sc://%C3%B1".parse().unwrap();
let url = base.join("").unwrap();
assert_eq!(url.as_str(), "sc://%C3%B1");
}
#[test]
fn test_strip_trailing_spaces_from_opaque_path() {
let mut url: Url = "data:space ?query".parse().unwrap();
url.set_query(None);
*** Begin Patch
*** Update File: /app/url/tests/unit.rs
@@
fn test_non_special_path3() {
let mut db_url = url::Url::parse("postgres://postgres@localhost/").unwrap();
assert_eq!(db_url.as_str(), "postgres://postgres@localhost/");
db_url.set_path("/");
@@
assert_eq!(db_url.as_str(), "postgres://postgres@localhost/foo");
assert_eq!(db_url.path(), "/foo");
}
+#[test]
+fn test_non_special_no_authority_double_slash_path_marker() {
+ use url::Position::*;
+
+ let url = Url::parse("foo:/.//path?query#fragment").unwrap();
+ assert_eq!(url.as_str(), "foo:/.//path?query#fragment");
+ assert_eq!(url.host_str(), None);
+ assert_eq!(url.path(), "//path");
+ assert_eq!(&url[AfterPort..BeforePath], "/.");
+ assert_eq!(&url[BeforePath..AfterPath], "//path");
+
+ let reparsed = Url::parse(url.as_str()).unwrap();
+ assert_eq!(reparsed.as_str(), url.as_str());
+ assert_eq!(reparsed.host_str(), None);
+ assert_eq!(reparsed.path(), "//path");
+
+ let url = Url::parse("foo:/path").unwrap();
+ assert_eq!(url.path(), "/path");
+ assert_eq!(&url[AfterPort..BeforePath], "");
+}
+
+#[test]
+fn test_non_special_no_authority_double_slash_path_marker_join() {
+ let base = Url::parse("foo:/.//a/b?old#frag").unwrap();
+
+ let query = base.join("?q").unwrap();
+ assert_eq!(query.as_str(), "foo:/.//a/b?q");
+ assert_eq!(query.path(), "//a/b");
+
+ let fragment = base.join("#new").unwrap();
+ assert_eq!(fragment.as_str(), "foo:/.//a/b?old#new");
+ assert_eq!(fragment.path(), "//a/b");
+
+ let child = base.join("c").unwrap();
+ assert_eq!(child.as_str(), "foo:/.//a/c");
+ assert_eq!(child.path(), "//a/c");
+
+ let absolute_path = base.join("/c").unwrap();
+ assert_eq!(absolute_path.as_str(), "foo:/c");
+ assert_eq!(absolute_path.path(), "/c");
+
+ let authority = base.join("//host/path").unwrap();
+ assert_eq!(authority.as_str(), "foo://host/path");
+ assert_eq!(authority.host_str(), Some("host"));
+ assert_eq!(authority.path(), "/path");
+}
+
#[test]
fn test_set_scheme_to_file_with_host() {
let mut url: Url = "http://localhost:6767/foo/bar".parse().unwrap();
let result = url.set_scheme("file");
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M /app/url/tests/unit.rs
cargo test -p url --test unit non_special_no_authority_double_slash_path_marker --locked
Chunk ID: 1e7448
Wall time: 2.1116 seconds
Process exited with code 0
Original token count: 621
Output:
Compiling proc-macro2 v1.0.106
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> percent_encoding/src/lib.rs:462:35
|
462 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
462 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
462 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `percent-encoding` (lib) generated 1 warning
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> form_urlencoded/src/lib.rs:403:35
|
403 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
403 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
403 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `form_urlencoded` (lib) generated 1 warning
Compiling url v2.3.1 (/app/url)
Compiling quote v1.0.45
Compiling syn v1.0.109
Compiling debugger_test v0.1.5
Finished `test` profile [unoptimized + debuginfo] target(s) in 2.22s
Running tests/unit.rs (target/debug/deps/unit-a494890561398094)
running 2 tests
test test_non_special_no_authority_double_slash_path_marker ... ok
test test_non_special_no_authority_double_slash_path_marker_join ... ok
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 58 filtered out; finished in 0.00s
*** Begin Patch
*** Update File: /app/url/tests/unit.rs
@@
let child = base.join("c").unwrap();
assert_eq!(child.as_str(), "foo:/.//a/c");
assert_eq!(child.path(), "//a/c");
+ let parent = base.join("../c").unwrap();
+ assert_eq!(parent.as_str(), "foo:/.//c");
+ assert_eq!(parent.path(), "//c");
+
+ let root_parent = base.join("../../c").unwrap();
+ assert_eq!(root_parent.as_str(), "foo:/c");
+ assert_eq!(root_parent.path(), "/c");
+
let absolute_path = base.join("/c").unwrap();
assert_eq!(absolute_path.as_str(), "foo:/c");
assert_eq!(absolute_path.path(), "/c");
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M /app/url/tests/unit.rs
cargo test -p url --test unit non_special_no_authority_double_slash_path_marker --locked
Chunk ID: 670bb6
Wall time: 0.1118 seconds
Process exited with code 0
Original token count: 591
Output:
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> percent_encoding/src/lib.rs:462:35
|
462 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
462 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
462 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `percent-encoding` (lib) generated 1 warning
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> form_urlencoded/src/lib.rs:403:35
|
403 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
403 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
403 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `form_urlencoded` (lib) generated 1 warning
Compiling url v2.3.1 (/app/url)
Finished `test` profile [unoptimized + debuginfo] target(s) in 0.24s
Running tests/unit.rs (target/debug/deps/unit-a494890561398094)
running 2 tests
test test_non_special_no_authority_double_slash_path_marker ... ok
test test_non_special_no_authority_double_slash_path_marker_join ... ok
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 58 filtered out; finished in 0.00s
cargo test -p url --test unit --locked
Chunk ID: 0520b7
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 1043
Output:
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> percent_encoding/src/lib.rs:462:35
|
462 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
462 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
462 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `percent-encoding` (lib) generated 1 warning
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> form_urlencoded/src/lib.rs:403:35
|
403 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
403 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
403 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `form_urlencoded` (lib) generated 1 warning
Finished `test` profile [unoptimized + debuginfo] target(s) in 0.01s
Running tests/unit.rs (target/debug/deps/unit-a494890561398094)
running 60 tests
test append_trailing_slash ... ok
test append_empty_segment_then_mutate ... ok
test form_urlencoded_encoding_override ... ok
test extend_query_pairs_then_mutate ... ok
test from_str ... ok
test host_serialization ... ok
test host ... ok
test issue_124 ... ok
test issue_197 ... ok
test issue_241 ... ok
test issue_61 ... ok
test new_directory_paths ... ok
test new_file_paths ... ok
test new_path_bad_utf8 ... ok
test new_path_windows_fun ... ok
test no_panic ... ok
test parse_with_params ... ok
test path_backslash_fun ... ok
test size ... ok
test pop_if_empty_in_bounds ... ok
test test_domain ... ok
test test_authority ... ok
test test_equality ... ok
test test_form_serialize ... ok
test test_domain_encoding_quirks ... ok
test test_form_urlencoded ... ok
test test_fragment ... ok
test test_has_authority ... ok
test test_idna ... ok
test test_leading_dots ... ok
test test_no_base_url ... ok
test test_non_special_no_authority_double_slash_path_marker ... ok
test test_non_special_no_authority_double_slash_path_marker_join ... ok
test test_make_relative ... ok
test test_non_special_path ... ok
test test_non_special_path2 ... ok
test test_non_special_path3 ... ok
test test_options_reuse ... ok
test test_origin_blob_equality ... ok
test test_origin_opaque ... ok
test test_origin_hash ... ok
test test_query ... ok
test test_origin_unicode_serialization ... ok
test test_relative ... ok
test test_relative_empty ... ok
test test_serialization ... ok
test test_set_empty_host ... ok
test test_set_empty_hostname ... ok
test test_set_host ... ok
test test_set_href ... ok
test test_set_ip_host ... ok
test test_set_scheme_to_file_with_host ... ok
test test_slicing ... ok
test test_strip_trailing_spaces_from_opaque_path ... ok
test test_syntax_violation_callback ... ok
test test_syntax_violation_callback_lifetimes ... ok
test test_syntax_violation_callback_types ... ok
test test_url_from_file_path ... ok
test test_socket_addrs ... ok
test test_windows_unc_path ... ok
test result: ok. 60 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
cargo build --locked
Chunk ID: ad4d16
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 755
Output:
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> percent_encoding/src/lib.rs:462:35
|
462 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
462 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
462 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `percent-encoding` (lib) generated 1 warning
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> form_urlencoded/src/lib.rs:403:35
|
403 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
403 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
403 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `form_urlencoded` (lib) generated 1 warning
warning: field `0` is never read
--> data-url/src/forgiving_base64.rs:4:26
|
4 | pub struct InvalidBase64(InvalidBase64Details);
| ------------- ^^^^^^^^^^^^^^^^^^^^
| |
| field in this struct
|
= help: consider removing this field
= note: `InvalidBase64` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
= note: `#[warn(dead_code)]` on by default
warning: field `0` is never read
--> data-url/src/forgiving_base64.rs:8:22
|
8 | UnexpectedSymbol(u8),
| ---------------- ^^
| |
| field in this variant
|
= note: `InvalidBase64Details` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
help: consider changing the field to be of unit type to suppress this warning while preserving the field numbering, or remove the field
|
8 | UnexpectedSymbol(()),
| ~~
warning: `data-url` (lib) generated 2 warnings
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.00s
cargo test -p url --locked
Chunk ID: 1fc7c8
Wall time: 3.5915 seconds
Process exited with code 0
Original token count: 2149
Output:
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> percent_encoding/src/lib.rs:462:35
|
462 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
462 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
462 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `percent-encoding` (lib) generated 1 warning
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> form_urlencoded/src/lib.rs:403:35
|
403 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
403 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
403 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `form_urlencoded` (lib) generated 1 warning
Compiling url v2.3.1 (/app/url)
Finished `test` profile [unoptimized + debuginfo] target(s) in 0.27s
Running unittests src/lib.rs (target/debug/deps/url-2559718008fa8f63)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running tests/data.rs (target/debug/deps/data-2c0f19163cfb41ae)
running 2 tests
test setters_tests ... ok
test urltestdata ... ok
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
Running tests/unit.rs (target/debug/deps/unit-a494890561398094)
running 60 tests
test append_trailing_slash ... ok
test append_empty_segment_then_mutate ... ok
test extend_query_pairs_then_mutate ... ok
test form_urlencoded_encoding_override ... ok
test from_str ... ok
test host ... ok
test issue_124 ... ok
test host_serialization ... ok
test issue_197 ... ok
test issue_241 ... ok
test issue_61 ... ok
test new_directory_paths ... ok
test new_file_paths ... ok
test new_path_windows_fun ... ok
test new_path_bad_utf8 ... ok
test no_panic ... ok
test parse_with_params ... ok
test path_backslash_fun ... ok
test pop_if_empty_in_bounds ... ok
test size ... ok
test test_domain ... ok
test test_authority ... ok
test test_domain_encoding_quirks ... ok
test test_equality ... ok
test test_form_serialize ... ok
test test_form_urlencoded ... ok
test test_has_authority ... ok
test test_fragment ... ok
test test_leading_dots ... ok
test test_idna ... ok
test test_no_base_url ... ok
test test_non_special_no_authority_double_slash_path_marker ... ok
test test_non_special_no_authority_double_slash_path_marker_join ... ok
test test_non_special_path ... ok
test test_non_special_path2 ... ok
test test_make_relative ... ok
test test_non_special_path3 ... ok
test test_options_reuse ... ok
test test_origin_blob_equality ... ok
test test_origin_opaque ... ok
test test_origin_hash ... ok
test test_query ... ok
test test_origin_unicode_serialization ... ok
test test_relative ... ok
test test_relative_empty ... ok
test test_set_empty_host ... ok
test test_set_empty_hostname ... ok
test test_serialization ... ok
test test_set_host ... ok
test test_set_href ... ok
test test_set_ip_host ... ok
test test_set_scheme_to_file_with_host ... ok
test test_slicing ... ok
test test_strip_trailing_spaces_from_opaque_path ... ok
test test_syntax_violation_callback ... ok
test test_syntax_violation_callback_lifetimes ... ok
test test_syntax_violation_callback_types ... ok
test test_url_from_file_path ... ok
test test_socket_addrs ... ok
test test_windows_unc_path ... ok
test result: ok. 60 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests url
running 66 tests
test url/src/lib.rs - (line 18) ... ok
test url/src/lib.rs - (line 26) ... ok
test url/src/lib.rs - (line 89) ... ok
test url/src/lib.rs - (line 57) ... ok
test url/src/lib.rs - (line 97) ... ok
test url/src/lib.rs - ParseOptions<'a>::syntax_violation_callback (line 222) ... ok
test url/src/lib.rs - Url::as_str (line 555) ... ok
test url/src/lib.rs - Url::authority (line 925) ... ok
test url/src/lib.rs - Url::cannot_be_a_base (line 961) ... ok
test url/src/lib.rs - Url::domain (line 1164) ... ok
test url/src/lib.rs - Url::from_file_path (line 2442) ... ok
test url/src/lib.rs - Url::fragment (line 1462) ... ok
test url/src/lib.rs - Url::has_authority (line 881) ... ok
test url/src/lib.rs - Url::has_host (line 1056) ... ok
test url/src/lib.rs - Url::host (line 1129) ... ok
test url/src/lib.rs - Url::host_str (line 1090) ... ok
test url/src/lib.rs - Url::join (line 361) ... ok
test url/src/lib.rs - Url::into_string (line 578) ... ok
test url/src/lib.rs - Url::options (line 528) ... ok
test url/src/lib.rs - Url::make_relative (line 396) ... ok
test url/src/lib.rs - Url::origin (line 784) ... ok
test url/src/lib.rs - Url::origin (line 801) ... ok
test url/src/lib.rs - Url::origin (line 835) ... ok
test url/src/lib.rs - Url::origin (line 818) ... ok
test url/src/lib.rs - Url::parse (line 261) ... ok
test url/src/lib.rs - Url::parse_with_params (line 289) ... ok
test url/src/lib.rs - Url::password (line 1018) ... ok
test url/src/lib.rs - Url::path (line 1311) ... ok
test url/src/lib.rs - Url::port (line 1195) ... ok
test url/src/lib.rs - Url::path_segments (line 1347) ... ok
test url/src/lib.rs - Url::port_or_known_default (line 1227) ... ok
test url/src/lib.rs - Url::query (line 1383) ... ok
test url/src/lib.rs - Url::query_pairs_mut (line 1604) ... ok
test url/src/lib.rs - Url::query_pairs (line 1422) ... ok
test url/src/lib.rs - Url::set_fragment (line 1496) ... ok
test url/src/lib.rs - Url::scheme (line 855) ... ok
test url/src/lib.rs - Url::set_host (line 1869) ... ok
test url/src/lib.rs - Url::set_host (line 1885) ... ok
test url/src/lib.rs - Url::set_host (line 1901) ... ok
test url/src/lib.rs - Url::set_host (line 1917) ... ok
test url/src/lib.rs - Url::set_ip_host (line 2057) ... ok
test url/src/lib.rs - Url::set_ip_host (line 2072) ... ok
test url/src/lib.rs - Url::set_path (line 1666) ... ok
test url/src/lib.rs - Url::set_password (line 2106) ... ok
test url/src/lib.rs - Url::set_port (line 1776) ... ok
test url/src/lib.rs - Url::set_port (line 1757) ... ok
test url/src/lib.rs - Url::set_port (line 1792) ... ok
test url/src/lib.rs - Url::set_query (line 1554) ... ok
test url/src/lib.rs - Url::set_scheme (line 2306) ... ok
test url/src/lib.rs - Url::set_scheme (line 2291) ... ok
test url/src/lib.rs - Url::set_scheme (line 2338) ... ok
test url/src/lib.rs - Url::set_scheme (line 2322) ... ok
test url/src/lib.rs - Url::set_scheme (line 2368) ... ok
test url/src/lib.rs - Url::set_scheme (line 2353) ... ok
test url/src/lib.rs - Url::set_username (line 2191) ... ok
test url/src/lib.rs - Url::set_username (line 2206) ... ok
test url/src/lib.rs - Url::socket_addrs (line 1260) - compile ... ok
test url/src/lib.rs - Url::socket_addrs (line 1267) ... ok
test url/src/lib.rs - Url::to_file_path (line 2602) ... ok
test url/src/lib.rs - Url::username (line 988) ... ok
test url/src/path_segments.rs - path_segments::PathSegmentsMut (line 20) ... ok
test url/src/path_segments.rs - path_segments::PathSegmentsMut<'a>::clear (line 80) ... ok
test url/src/path_segments.rs - path_segments::PathSegmentsMut<'a>::extend (line 183) ... ok
test url/src/path_segments.rs - path_segments::PathSegmentsMut<'a>::extend (line 203) ... ok
test url/src/slicing.rs - slicing::Position (line 44) ... ok
test url/src/path_segments.rs - path_segments::PathSegmentsMut<'a>::pop_if_empty (line 108) ... ok
test result: ok. 66 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.35s
nl -ba url/src/lib.rs | sed -n '630,735p'
Chunk ID: 66503f
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 1380
Output:
630 assert!(self.byte_at(0).is_ascii_alphabetic());
631 assert!(self
632 .slice(1..self.scheme_end)
633 .chars()
634 .all(|c| matches!(c, 'a'..='z' | 'A'..='Z' | '0'..='9' | '+' | '-' | '.')));
635 assert_eq!(self.byte_at(self.scheme_end), b':');
636
637 if self.has_authority() {
638 // URL with authority
639 if self.username_end != self.serialization.len() as u32 {
640 match self.byte_at(self.username_end) {
641 b':' => {
642 assert!(self.host_start >= self.username_end + 2);
643 assert_eq!(self.byte_at(self.host_start - 1), b'@');
644 }
645 b'@' => assert!(self.host_start == self.username_end + 1),
646 _ => assert_eq!(self.username_end, self.scheme_end + 3),
647 }
648 }
649 assert!(self.host_start >= self.username_end);
650 assert!(self.host_end >= self.host_start);
651 let host_str = self.slice(self.host_start..self.host_end);
652 match self.host {
653 HostInternal::None => assert_eq!(host_str, ""),
654 HostInternal::Ipv4(address) => assert_eq!(host_str, address.to_string()),
655 HostInternal::Ipv6(address) => {
656 let h: Host<String> = Host::Ipv6(address);
657 assert_eq!(host_str, h.to_string())
658 }
659 HostInternal::Domain => {
660 if SchemeType::from(self.scheme()).is_special() {
661 assert!(!host_str.is_empty())
662 }
663 }
664 }
665 if self.path_start == self.host_end {
666 assert_eq!(self.port, None);
667 } else {
668 assert_eq!(self.byte_at(self.host_end), b':');
669 let port_str = self.slice(self.host_end + 1..self.path_start);
670 assert_eq!(
671 self.port,
672 Some(port_str.parse::<u16>().expect("Couldn't parse port?"))
673 );
674 }
675 assert!(
676 self.path_start as usize == self.serialization.len()
677 || matches!(self.byte_at(self.path_start), b'/' | b'#' | b'?')
678 );
679 } else {
680 // Anarchist URL (no authority)
681 assert_eq!(self.username_end, self.scheme_end + 1);
682 assert_eq!(self.host_start, self.scheme_end + 1);
683 assert_eq!(self.host_end, self.scheme_end + 1);
684 assert_eq!(self.host, HostInternal::None);
685 assert_eq!(self.port, None);
686 if self.has_no_authority_path_marker() {
687 assert_eq!(self.path_start, self.scheme_end + 3);
688 assert_eq!(self.slice(self.scheme_end + 1..self.path_start), "/.");
689 assert!(self.path().starts_with("//"));
690 } else {
691 assert_eq!(self.path_start, self.scheme_end + 1);
692 }
693 }
694 if let Some(start) = self.query_start {
695 assert!(start >= self.path_start);
696 assert_eq!(self.byte_at(start), b'?');
697 }
698 if let Some(start) = self.fragment_start {
699 assert!(start >= self.path_start);
700 assert_eq!(self.byte_at(start), b'#');
701 }
702 if let (Some(query_start), Some(fragment_start)) = (self.query_start, self.fragment_start) {
703 assert!(fragment_start > query_start);
704 }
705
706 let other = Url::parse(self.as_str()).expect("Failed to parse myself?");
707 assert_eq!(&self.serialization, &other.serialization);
708 assert_eq!(self.scheme_end, other.scheme_end);
709 assert_eq!(self.username_end, other.username_end);
710 assert_eq!(self.host_start, other.host_start);
711 assert_eq!(self.host_end, other.host_end);
712 assert!(
713 self.host == other.host ||
714 // XXX No host round-trips to empty host.
715 // See https://[code-host]/whatwg/url/issues/79
716 (self.host_str(), other.host_str()) == (None, Some(""))
717 );
718 assert_eq!(self.port, other.port);
719 assert_eq!(self.path_start, other.path_start);
720 assert_eq!(self.query_start, other.query_start);
721 assert_eq!(self.fragment_start, other.fragment_start);
722 Ok(())
723 }
724
725 pub(crate) fn has_no_authority_path_marker(&self) -> bool {
726 SchemeType::from(self.scheme()) == SchemeType::NotSpecial
727 && self.is_no_authority()
728 && self.path_start >= self.scheme_end + 3
729 && self.slice(self.path_start - 2..self.path_start) == "/."
730 }
731
732 pub(crate) fn path_start_before_marker(&self) -> u32 {
733 if self.has_no_authority_path_marker() {
734 self.path_start - 2
735 } else {
nl -ba url/src/lib.rs | sed -n '880,910p'
Chunk ID: ac6848
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 294
Output:
880 ///
881 /// ```
882 /// use url::Url;
883 /// # use url::ParseError;
884 ///
885 /// # fn run() -> Result<(), ParseError> {
886 /// let url = Url::parse("ftp://rms@example.com")?;
887 /// assert!(url.has_authority());
888 ///
889 /// let url = Url::parse("unix:/run/foo.socket")?;
890 /// assert!(!url.has_authority());
891 ///
892 /// let url = Url::parse("data:text/plain,Stuff")?;
893 /// assert!(!url.has_authority());
894 /// # Ok(())
895 /// # }
896 /// # run().unwrap();
897 /// ```
898 #[inline]
899 pub fn has_authority(&self) -> bool {
900 debug_assert!(self.byte_at(self.scheme_end) == b':');
901 self.slice(self.scheme_end..).starts_with("://")
902 }
903
904 fn is_no_authority(&self) -> bool {
905 self.username_end == self.scheme_end + 1
906 && self.host_start == self.scheme_end + 1
907 && self.host_end == self.scheme_end + 1
908 && self.host == HostInternal::None
909 && self.port.is_none()
910 }
nl -ba url/src/lib.rs | sed -n '1630,1660p'
Chunk ID: 20e049
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 339
Output:
1630 /// The state of `Url` is unspecified if this return value is leaked without being dropped.
1631 pub fn query_pairs_mut(&mut self) -> form_urlencoded::Serializer<'_, UrlQuery<'_>> {
1632 let fragment = self.take_fragment();
1633
1634 let query_start;
1635 if let Some(start) = self.query_start {
1636 debug_assert!(self.byte_at(start) == b'?');
1637 query_start = start as usize;
1638 } else {
1639 query_start = self.serialization.len();
1640 self.query_start = Some(to_u32(query_start).unwrap());
1641 self.serialization.push('?');
1642 }
1643
1644 let query = UrlQuery {
1645 url: Some(self),
1646 fragment,
1647 };
1648 form_urlencoded::Serializer::for_suffix(query, query_start + "?".len())
1649 }
1650
1651 fn take_after_path(&mut self) -> String {
1652 match (self.query_start, self.fragment_start) {
1653 (Some(i), _) | (None, Some(i)) => {
1654 let after_path = self.slice(i..).to_owned();
1655 self.serialization.truncate(i as usize);
1656 after_path
1657 }
1658 (None, None) => String::new(),
1659 }
1660 }
nl -ba url/src/parser.rs | sed -n '760,830p'
Chunk ID: f39469
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 855
Output:
760 .push_str(base_url.slice(..scheme_end + 1));
761 if let Some(after_prefix) = input.split_prefix("//") {
762 return self.after_double_slash(after_prefix, scheme_type, scheme_end);
763 }
764 return self.after_double_slash(remaining, scheme_type, scheme_end);
765 }
766 let path_start = base_url.path_start_before_marker();
767 self.serialization.push_str(base_url.slice(..path_start));
768 self.serialization.push('/');
769 let remaining = self.parse_path(
770 scheme_type,
771 &mut true,
772 path_start as usize,
773 input_after_first_char,
774 );
775 self.with_query_and_fragment(
776 scheme_type,
777 base_url.scheme_end,
778 base_url.username_end,
779 base_url.host_start,
780 base_url.host_end,
781 base_url.host,
782 base_url.port,
783 path_start,
784 remaining,
785 )
786 }
787 _ => {
788 let path_start = base_url.path_start_before_marker();
789 self.serialization.push_str(base_url.slice(..path_start));
790 self.serialization.push_str(base_url.path());
791 // FIXME spec says just "remove last entry", not the "pop" algorithm
792 self.pop_path(scheme_type, path_start as usize);
793 // A special url always has a path.
794 // A path always starts with '/'
795 if self.serialization.len() == path_start as usize
796 && (SchemeType::from(base_url.scheme()).is_special() || !input.is_empty())
797 {
798 self.serialization.push('/');
799 }
800 let remaining = match input.split_first() {
801 (Some('/'), remaining) => self.parse_path(
802 scheme_type,
803 &mut true,
804 path_start as usize,
805 remaining,
806 ),
807 _ => {
808 self.parse_path(scheme_type, &mut true, path_start as usize, input)
809 }
810 };
811 self.with_query_and_fragment(
812 scheme_type,
813 base_url.scheme_end,
814 base_url.username_end,
815 base_url.host_start,
816 base_url.host_end,
817 base_url.host,
818 base_url.port,
819 path_start,
820 remaining,
821 )
822 }
823 }
824 }
825
826 fn after_double_slash(
827 mut self,
828 input: Input<'_>,
829 scheme_type: SchemeType,
830 scheme_end: u32,
nl -ba url/src/parser.rs | sed -n '1348,1390p'
Chunk ID: 57049c
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 406
Output:
1348 scheme_type: SchemeType,
1349 scheme_end: u32,
1350 username_end: u32,
1351 host_start: u32,
1352 host_end: u32,
1353 host: HostInternal,
1354 port: Option<u16>,
1355 mut path_start: u32,
1356 remaining: Input<'_>,
1357 ) -> ParseResult<Url> {
1358 if scheme_type == SchemeType::NotSpecial
1359 && username_end == scheme_end + 1
1360 && host_start == scheme_end + 1
1361 && host_end == scheme_end + 1
1362 && host == HostInternal::None
1363 && port.is_none()
1364 && self.serialization[path_start as usize..].starts_with("//")
1365 {
1366 self.serialization.insert_str(path_start as usize, "/.");
1367 path_start += 2;
1368 }
1369 let (query_start, fragment_start) =
1370 self.parse_query_and_fragment(scheme_type, scheme_end, remaining)?;
1371 Ok(Url {
1372 serialization: self.serialization,
1373 scheme_end,
1374 username_end,
1375 host_start,
1376 host_end,
1377 host,
1378 port,
1379 path_start,
1380 query_start,
1381 fragment_start,
1382 })
1383 }
1384
1385 /// Return (query_start, fragment_start)
1386 fn parse_query_and_fragment(
1387 &mut self,
1388 scheme_type: SchemeType,
1389 scheme_end: u32,
1390 mut input: Input<'_>,
nl -ba url/src/slicing.rs | sed -n '145,158p'
Chunk ID: f6b59b
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 161
Output:
145 debug_assert!(self.byte_at(self.host_end) == b':');
146 self.host_end as usize + ":".len()
147 } else {
148 self.host_end as usize
149 }
150 }
151
152 Position::AfterPort => self.path_start_before_marker() as usize,
153
154 Position::BeforePath => self.path_start as usize,
155
156 Position::AfterPath => match (self.query_start, self.fragment_start) {
157 (Some(q), _) => q as usize,
158 (None, Some(f)) => f as usize,
nl -ba url/src/path_segments.rs | sed -n '55,70p'
Chunk ID: a4894a
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 129
Output:
55 );
56 }
57 PathSegmentsMut {
58 after_first_slash: url.path_start as usize + "/".len(),
59 url,
60 old_after_path_position,
61 after_path,
62 }
63 }
64
65 impl<'a> Drop for PathSegmentsMut<'a> {
66 fn drop(&mut self) {
67 self.url.normalize_no_authority_path_marker();
68 self.url
69 .restore_after_path(self.old_after_path_position, &self.after_path)
70 }
nl -ba url/tests/unit.rs | sed -n '940,1005p'
Chunk ID: ecb322
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 669
Output:
940 assert_eq!(db_url.path(), "/foo");
941 }
942
943 #[test]
944 fn test_non_special_no_authority_double_slash_path_marker() {
945 use url::Position::*;
946
947 let url = Url::parse("foo:/.//path?query#fragment").unwrap();
948 assert_eq!(url.as_str(), "foo:/.//path?query#fragment");
949 assert_eq!(url.host_str(), None);
950 assert_eq!(url.path(), "//path");
951 assert_eq!(&url[AfterPort..BeforePath], "/.");
952 assert_eq!(&url[BeforePath..AfterPath], "//path");
953
954 let reparsed = Url::parse(url.as_str()).unwrap();
955 assert_eq!(reparsed.as_str(), url.as_str());
956 assert_eq!(reparsed.host_str(), None);
957 assert_eq!(reparsed.path(), "//path");
958
959 let url = Url::parse("foo:/path").unwrap();
960 assert_eq!(url.path(), "/path");
961 assert_eq!(&url[AfterPort..BeforePath], "");
962 }
963
964 #[test]
965 fn test_non_special_no_authority_double_slash_path_marker_join() {
966 let base = Url::parse("foo:/.//a/b?old#frag").unwrap();
967
968 let query = base.join("?q").unwrap();
969 assert_eq!(query.as_str(), "foo:/.//a/b?q");
970 assert_eq!(query.path(), "//a/b");
971
972 let fragment = base.join("#new").unwrap();
973 assert_eq!(fragment.as_str(), "foo:/.//a/b?old#new");
974 assert_eq!(fragment.path(), "//a/b");
975
976 let child = base.join("c").unwrap();
977 assert_eq!(child.as_str(), "foo:/.//a/c");
978 assert_eq!(child.path(), "//a/c");
979
980 let parent = base.join("../c").unwrap();
981 assert_eq!(parent.as_str(), "foo:/.//c");
982 assert_eq!(parent.path(), "//c");
983
984 let root_parent = base.join("../../c").unwrap();
985 assert_eq!(root_parent.as_str(), "foo:/c");
986 assert_eq!(root_parent.path(), "/c");
987
988 let absolute_path = base.join("/c").unwrap();
989 assert_eq!(absolute_path.as_str(), "foo:/c");
990 assert_eq!(absolute_path.path(), "/c");
991
992 let authority = base.join("//host/path").unwrap();
993 assert_eq!(authority.as_str(), "foo://host/path");
994 assert_eq!(authority.host_str(), Some("host"));
995 assert_eq!(authority.path(), "/path");
996 }
997
998 #[test]
999 fn test_set_scheme_to_file_with_host() {
1000 let mut url: Url = "http://localhost:6767/foo/bar".parse().unwrap();
1001 let result = url.set_scheme("file");
1002 assert_eq!(url.to_string(), "http://localhost:6767/foo/bar");
1003 assert_eq!(result, Err(()));
1004 }
1005
nl -ba url/src/lib.rs | sed -n '725,770p'
Chunk ID: b9ebdd
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 530
Output:
725 pub(crate) fn has_no_authority_path_marker(&self) -> bool {
726 SchemeType::from(self.scheme()) == SchemeType::NotSpecial
727 && self.is_no_authority()
728 && self.path_start >= self.scheme_end + 3
729 && self.slice(self.path_start - 2..self.path_start) == "/."
730 }
731
732 pub(crate) fn path_start_before_marker(&self) -> u32 {
733 if self.has_no_authority_path_marker() {
734 self.path_start - 2
735 } else {
736 self.path_start
737 }
738 }
739
740 pub(crate) fn normalize_no_authority_path_marker(&mut self) {
741 if SchemeType::from(self.scheme()) != SchemeType::NotSpecial || !self.is_no_authority() {
742 return;
743 }
744
745 let has_marker = self.has_no_authority_path_marker();
746 let should_have_marker = self.path().starts_with("//");
747 match (has_marker, should_have_marker) {
748 (false, true) => {
749 let marker_start = self.path_start;
750 self.serialization.insert_str(marker_start as usize, "/.");
751 self.path_start += 2;
752 if let Some(ref mut index) = self.query_start {
753 *index += 2
754 }
755 if let Some(ref mut index) = self.fragment_start {
756 *index += 2
757 }
758 }
759 (true, false) => {
760 let marker_start = self.path_start - 2;
761 self.serialization
762 .drain(marker_start as usize..self.path_start as usize);
763 self.path_start -= 2;
764 if let Some(ref mut index) = self.query_start {
765 *index -= 2
766 }
767 if let Some(ref mut index) = self.fragment_start {
768 *index -= 2
769 }
770 }
nl -ba url/src/lib.rs | sed -n '1670,1705p'
Chunk ID: e5157d
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 493
Output:
1670 /// # fn run() -> Result<(), ParseError> {
1671 /// let mut url = Url::parse("https://example.com")?;
1672 /// url.set_path("api/comments");
1673 /// assert_eq!(url.as_str(), "https://example.com/api/comments");
1674 /// assert_eq!(url.path(), "/api/comments");
1675 ///
1676 /// let mut url = Url::parse("https://example.com/api")?;
1677 /// url.set_path("data/report.csv");
1678 /// assert_eq!(url.as_str(), "https://example.com/data/report.csv");
1679 /// assert_eq!(url.path(), "/data/report.csv");
1680 ///
1681 /// // `set_path` percent-encodes the given string if it's not already percent-encoded.
1682 /// let mut url = Url::parse("https://example.com")?;
1683 /// url.set_path("api/some comments");
1684 /// assert_eq!(url.as_str(), "https://example.com/api/some%20comments");
1685 /// assert_eq!(url.path(), "/api/some%20comments");
1686 ///
1687 /// // `set_path` will not double percent-encode the string if it's already percent-encoded.
1688 /// let mut url = Url::parse("https://example.com")?;
1689 /// url.set_path("api/some%20comments");
1690 /// assert_eq!(url.as_str(), "https://example.com/api/some%20comments");
1691 /// assert_eq!(url.path(), "/api/some%20comments");
1692 ///
1693 /// # Ok(())
1694 /// # }
1695 /// # run().unwrap();
1696 /// ```
1697 pub fn set_path(&mut self, mut path: &str) {
1698 let after_path = self.take_after_path();
1699 let old_after_path_pos = to_u32(self.serialization.len()).unwrap();
1700 let cannot_be_a_base = self.cannot_be_a_base();
1701 let scheme_type = SchemeType::from(self.scheme());
1702 self.serialization
1703 .truncate(self.path_start_before_marker() as usize);
1704 self.path_start = self.path_start_before_marker();
1705 self.mutate(|parser| {
nl -ba url/src/lib.rs | sed -n '1700,1725p'
Chunk ID: 6ec1a5
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 332
Output:
1700 let cannot_be_a_base = self.cannot_be_a_base();
1701 let scheme_type = SchemeType::from(self.scheme());
1702 self.serialization
1703 .truncate(self.path_start_before_marker() as usize);
1704 self.path_start = self.path_start_before_marker();
1705 self.mutate(|parser| {
1706 if cannot_be_a_base {
1707 if path.starts_with('/') {
1708 parser.serialization.push_str("%2F");
1709 path = &path[1..];
1710 }
1711 parser.parse_cannot_be_a_base_path(parser::Input::new(path));
1712 } else {
1713 let mut has_host = true; // FIXME
1714 parser.parse_path_start(scheme_type, &mut has_host, parser::Input::new(path));
1715 }
1716 });
1717 self.normalize_no_authority_path_marker();
1718 self.restore_after_path(old_after_path_pos, &after_path);
1719 }
1720
1721 /// Return an object with methods to manipulate this URL’s path segments.
1722 ///
1723 /// Return `Err(())` if this URL is cannot-be-a-base.
1724 #[allow(clippy::result_unit_err)]
1725 pub fn path_segments_mut(&mut self) -> Result<PathSegmentsMut<'_>, ()> {
*** Begin Patch
*** Update File: /app/url/src/lib.rs
@@
let old_after_path_pos = to_u32(self.serialization.len()).unwrap();
let cannot_be_a_base = self.cannot_be_a_base();
let scheme_type = SchemeType::from(self.scheme());
- self.serialization
- .truncate(self.path_start_before_marker() as usize);
- self.path_start = self.path_start_before_marker();
+ let path_start = self.path_start_before_marker();
+ self.serialization.truncate(path_start as usize);
+ self.path_start = path_start;
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M /app/url/src/lib.rs
*** Begin Patch
*** Update File: /app/url/tests/unit.rs
@@
let url = Url::parse("foo:/path").unwrap();
assert_eq!(url.path(), "/path");
assert_eq!(&url[AfterPort..BeforePath], "");
+
+ let mut url = Url::parse("foo:/.//old?query").unwrap();
+ url.set_path("/new");
+ assert_eq!(url.as_str(), "foo:/new?query");
+ assert_eq!(url.path(), "/new");
+
+ let mut url = Url::parse("foo:/.//old/path?query").unwrap();
+ url.path_segments_mut().unwrap().clear();
+ assert_eq!(url.as_str(), "foo:/?query");
+ assert_eq!(url.path(), "/");
}
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M /app/url/tests/unit.rs
cargo test -p url --test unit non_special_no_authority_double_slash_path_marker --locked
Chunk ID: 91ff05
Wall time: 0.3087 seconds
Process exited with code 101
Original token count: 701
Output:
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> percent_encoding/src/lib.rs:462:35
|
462 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
462 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
462 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `percent-encoding` (lib) generated 1 warning
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> form_urlencoded/src/lib.rs:403:35
|
403 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
403 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
403 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `form_urlencoded` (lib) generated 1 warning
Compiling url v2.3.1 (/app/url)
Finished `test` profile [unoptimized + debuginfo] target(s) in 0.43s
Running tests/unit.rs (target/debug/deps/unit-a494890561398094)
running 2 tests
test test_non_special_no_authority_double_slash_path_marker_join ... ok
test test_non_special_no_authority_double_slash_path_marker ... FAILED
failures:
---- test_non_special_no_authority_double_slash_path_marker stdout ----
thread 'test_non_special_no_authority_double_slash_path_marker' panicked at url/src/lib.rs:2752:11:
byte index 11 is out of bounds of `foo:/new`
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
failures:
test_non_special_no_authority_double_slash_path_marker
test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 58 filtered out; finished in 0.00s
error: test failed, to rerun pass `-p url --test unit`
nl -ba url/src/lib.rs | sed -n '2744,2758p'
Chunk ID: 1f7dbe
Wall time: 0.0001 seconds
Process exited with code 0
Original token count: 109
Output:
2744
2745 trait RangeArg {
2746 fn slice_of<'a>(&self, s: &'a str) -> &'a str;
2747 }
2748
2749 impl RangeArg for Range<u32> {
2750 #[inline]
2751 fn slice_of<'a>(&self, s: &'a str) -> &'a str {
2752 &s[self.start as usize..self.end as usize]
2753 }
2754 }
2755
2756 impl RangeArg for RangeFrom<u32> {
2757 #[inline]
2758 fn slice_of<'a>(&self, s: &'a str) -> &'a str {
*** Begin Patch
*** Update File: /app/url/src/lib.rs
@@
- let has_marker = self.has_no_authority_path_marker();
- let should_have_marker = self.path().starts_with("//");
+ let has_marker = self.has_no_authority_path_marker();
+ let path_end = [self.query_start, self.fragment_start]
+ .into_iter()
+ .flatten()
+ .filter(|&index| index as usize <= self.serialization.len())
+ .min()
+ .unwrap_or_else(|| to_u32(self.serialization.len()).unwrap());
+ let should_have_marker = self.slice(self.path_start..path_end).starts_with("//");
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M /app/url/src/lib.rs
cargo test -p url --test unit non_special_no_authority_double_slash_path_marker --locked
Chunk ID: e0b665
Wall time: 0.0018 seconds
Process exited with code 101
Original token count: 858
Output:
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> percent_encoding/src/lib.rs:462:35
|
462 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
462 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
462 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `percent-encoding` (lib) generated 1 warning
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> form_urlencoded/src/lib.rs:403:35
|
403 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
403 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
403 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `form_urlencoded` (lib) generated 1 warning
Compiling url v2.3.1 (/app/url)
error[E0308]: mismatched types
--> url/src/lib.rs:751:32
|
751 | .unwrap_or_else(|| to_u32(self.serialization.len()).unwrap());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `&u32`, found `u32`
|
help: consider borrowing here
|
751 | .unwrap_or_else(|| &to_u32(self.serialization.len()).unwrap());
| +
error[E0308]: mismatched types
--> url/src/lib.rs:752:62
|
752 | let should_have_marker = self.slice(self.path_start..path_end).starts_with("//");
| ^^^^^^^^ expected `u32`, found `&u32`
|
help: consider dereferencing the borrow
|
752 | let should_have_marker = self.slice(self.path_start..*path_end).starts_with("//");
| +
error[E0606]: casting `&u32` as `usize` is invalid
--> url/src/lib.rs:749:30
|
749 | .filter(|&index| index as usize <= self.serialization.len())
| ^^^^^^^^^^^^^^
|
help: dereference the expression
|
749 | .filter(|&index| *index as usize <= self.serialization.len())
| +
Some errors have detailed explanations: E0308, E0606.
For more information about an error, try `rustc --explain E0308`.
error: could not compile `url` (lib) due to 3 previous errors
*** Begin Patch
*** Update File: /app/url/src/lib.rs
@@
- let path_end = [self.query_start, self.fragment_start]
- .into_iter()
- .flatten()
+ let path_end = self
+ .query_start
+ .into_iter()
+ .chain(self.fragment_start)
.filter(|&index| index as usize <= self.serialization.len())
.min()
.unwrap_or_else(|| to_u32(self.serialization.len()).unwrap());
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M /app/url/src/lib.rs
cargo test -p url --test unit non_special_no_authority_double_slash_path_marker --locked
Chunk ID: 78c6d5
Wall time: 0.3047 seconds
Process exited with code 101
Original token count: 699
Output:
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> percent_encoding/src/lib.rs:462:35
|
462 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
462 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
462 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `percent-encoding` (lib) generated 1 warning
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> form_urlencoded/src/lib.rs:403:35
|
403 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
403 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
403 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `form_urlencoded` (lib) generated 1 warning
Compiling url v2.3.1 (/app/url)
Finished `test` profile [unoptimized + debuginfo] target(s) in 0.44s
Running tests/unit.rs (target/debug/deps/unit-a494890561398094)
running 2 tests
test test_non_special_no_authority_double_slash_path_marker ... FAILED
test test_non_special_no_authority_double_slash_path_marker_join ... ok
failures:
---- test_non_special_no_authority_double_slash_path_marker stdout ----
thread 'test_non_special_no_authority_double_slash_path_marker' panicked at url/src/lib.rs:1743:13:
attempt to subtract with overflow
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
failures:
test_non_special_no_authority_double_slash_path_marker
test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 58 filtered out; finished in 0.00s
error: test failed, to rerun pass `-p url --test unit`
nl -ba url/src/lib.rs | sed -n '1734,1748p'
Chunk ID: 63c646
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 152
Output:
1734 Err(())
1735 } else {
1736 Ok(path_segments::new(self))
1737 }
1738 }
1739
1740 fn restore_after_path(&mut self, old_after_path_position: u32, after_path: &str) {
1741 let new_after_path_position = to_u32(self.serialization.len()).unwrap();
1742 let adjust = |index: &mut u32| {
1743 *index -= old_after_path_position;
1744 *index += new_after_path_position;
1745 };
1746 if let Some(ref mut index) = self.query_start {
1747 adjust(index)
1748 }
*** Begin Patch
*** Update File: /app/url/src/lib.rs
@@
- self.normalize_no_authority_path_marker();
self.restore_after_path(old_after_path_pos, &after_path);
+ self.normalize_no_authority_path_marker();
}
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M /app/url/src/lib.rs
*** Begin Patch
*** Update File: /app/url/src/path_segments.rs
@@
impl<'a> Drop for PathSegmentsMut<'a> {
fn drop(&mut self) {
- self.url.normalize_no_authority_path_marker();
self.url
- .restore_after_path(self.old_after_path_position, &self.after_path)
+ .restore_after_path(self.old_after_path_position, &self.after_path);
+ self.url.normalize_no_authority_path_marker();
}
}
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M /app/url/src/path_segments.rs
cargo test -p url --test unit non_special_no_authority_double_slash_path_marker --locked
Chunk ID: d0c745
Wall time: 0.2659 seconds
Process exited with code 0
Original token count: 591
Output:
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> percent_encoding/src/lib.rs:462:35
|
462 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
462 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
462 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `percent-encoding` (lib) generated 1 warning
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> form_urlencoded/src/lib.rs:403:35
|
403 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
403 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
403 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `form_urlencoded` (lib) generated 1 warning
Compiling url v2.3.1 (/app/url)
Finished `test` profile [unoptimized + debuginfo] target(s) in 0.39s
Running tests/unit.rs (target/debug/deps/unit-a494890561398094)
running 2 tests
test test_non_special_no_authority_double_slash_path_marker_join ... ok
test test_non_special_no_authority_double_slash_path_marker ... ok
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 58 filtered out; finished in 0.00s
cargo test -p url --locked
Chunk ID: f7237d
Wall time: 3.5573 seconds
Process exited with code 0
Original token count: 2149
Output:
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> percent_encoding/src/lib.rs:462:35
|
462 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
462 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
462 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `percent-encoding` (lib) generated 1 warning
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> form_urlencoded/src/lib.rs:403:35
|
403 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
403 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
403 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `form_urlencoded` (lib) generated 1 warning
Compiling url v2.3.1 (/app/url)
Finished `test` profile [unoptimized + debuginfo] target(s) in 0.22s
Running unittests src/lib.rs (target/debug/deps/url-2559718008fa8f63)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running tests/data.rs (target/debug/deps/data-2c0f19163cfb41ae)
running 2 tests
test setters_tests ... ok
test urltestdata ... ok
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
Running tests/unit.rs (target/debug/deps/unit-a494890561398094)
running 60 tests
test append_trailing_slash ... ok
test append_empty_segment_then_mutate ... ok
test form_urlencoded_encoding_override ... ok
test extend_query_pairs_then_mutate ... ok
test from_str ... ok
test host_serialization ... ok
test issue_124 ... ok
test issue_197 ... ok
test host ... ok
test issue_241 ... ok
test issue_61 ... ok
test new_directory_paths ... ok
test new_file_paths ... ok
test new_path_bad_utf8 ... ok
test new_path_windows_fun ... ok
test no_panic ... ok
test parse_with_params ... ok
test path_backslash_fun ... ok
test pop_if_empty_in_bounds ... ok
test size ... ok
test test_domain ... ok
test test_authority ... ok
test test_domain_encoding_quirks ... ok
test test_form_serialize ... ok
test test_equality ... ok
test test_form_urlencoded ... ok
test test_fragment ... ok
test test_has_authority ... ok
test test_idna ... ok
test test_leading_dots ... ok
test test_no_base_url ... ok
test test_non_special_no_authority_double_slash_path_marker ... ok
test test_make_relative ... ok
test test_non_special_no_authority_double_slash_path_marker_join ... ok
test test_non_special_path ... ok
test test_non_special_path2 ... ok
test test_non_special_path3 ... ok
test test_options_reuse ... ok
test test_origin_blob_equality ... ok
test test_origin_opaque ... ok
test test_origin_hash ... ok
test test_query ... ok
test test_origin_unicode_serialization ... ok
test test_relative ... ok
test test_relative_empty ... ok
test test_set_empty_host ... ok
test test_serialization ... ok
test test_set_empty_hostname ... ok
test test_set_host ... ok
test test_set_ip_host ... ok
test test_set_href ... ok
test test_set_scheme_to_file_with_host ... ok
test test_slicing ... ok
test test_strip_trailing_spaces_from_opaque_path ... ok
test test_syntax_violation_callback ... ok
test test_syntax_violation_callback_lifetimes ... ok
test test_syntax_violation_callback_types ... ok
test test_url_from_file_path ... ok
test test_windows_unc_path ... ok
test test_socket_addrs ... ok
test result: ok. 60 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests url
running 66 tests
test url/src/lib.rs - (line 18) ... ok
test url/src/lib.rs - (line 26) ... ok
test url/src/lib.rs - (line 89) ... ok
test url/src/lib.rs - (line 57) ... ok
test url/src/lib.rs - (line 97) ... ok
test url/src/lib.rs - ParseOptions<'a>::syntax_violation_callback (line 222) ... ok
test url/src/lib.rs - Url::as_str (line 555) ... ok
test url/src/lib.rs - Url::authority (line 932) ... ok
test url/src/lib.rs - Url::cannot_be_a_base (line 968) ... ok
test url/src/lib.rs - Url::domain (line 1171) ... ok
test url/src/lib.rs - Url::fragment (line 1469) ... ok
test url/src/lib.rs - Url::from_file_path (line 2449) ... ok
test url/src/lib.rs - Url::has_authority (line 888) ... ok
test url/src/lib.rs - Url::has_host (line 1063) ... ok
test url/src/lib.rs - Url::host (line 1136) ... ok
test url/src/lib.rs - Url::host_str (line 1097) ... ok
test url/src/lib.rs - Url::into_string (line 578) ... ok
test url/src/lib.rs - Url::join (line 361) ... ok
test url/src/lib.rs - Url::make_relative (line 396) ... ok
test url/src/lib.rs - Url::options (line 528) ... ok
test url/src/lib.rs - Url::origin (line 791) ... ok
test url/src/lib.rs - Url::origin (line 808) ... ok
test url/src/lib.rs - Url::origin (line 825) ... ok
test url/src/lib.rs - Url::origin (line 842) ... ok
test url/src/lib.rs - Url::parse_with_params (line 289) ... ok
test url/src/lib.rs - Url::parse (line 261) ... ok
test url/src/lib.rs - Url::password (line 1025) ... ok
test url/src/lib.rs - Url::path (line 1318) ... ok
test url/src/lib.rs - Url::port (line 1202) ... ok
test url/src/lib.rs - Url::path_segments (line 1354) ... ok
test url/src/lib.rs - Url::port_or_known_default (line 1234) ... ok
test url/src/lib.rs - Url::query (line 1390) ... ok
test url/src/lib.rs - Url::query_pairs (line 1429) ... ok
test url/src/lib.rs - Url::query_pairs_mut (line 1611) ... ok
test url/src/lib.rs - Url::scheme (line 862) ... ok
test url/src/lib.rs - Url::set_fragment (line 1503) ... ok
test url/src/lib.rs - Url::set_host (line 1876) ... ok
test url/src/lib.rs - Url::set_host (line 1892) ... ok
test url/src/lib.rs - Url::set_host (line 1924) ... ok
test url/src/lib.rs - Url::set_host (line 1908) ... ok
test url/src/lib.rs - Url::set_ip_host (line 2064) ... ok
test url/src/lib.rs - Url::set_ip_host (line 2079) ... ok
test url/src/lib.rs - Url::set_path (line 1673) ... ok
test url/src/lib.rs - Url::set_password (line 2113) ... ok
test url/src/lib.rs - Url::set_port (line 1764) ... ok
test url/src/lib.rs - Url::set_port (line 1783) ... ok
test url/src/lib.rs - Url::set_port (line 1799) ... ok
test url/src/lib.rs - Url::set_query (line 1561) ... ok
test url/src/lib.rs - Url::set_scheme (line 2313) ... ok
test url/src/lib.rs - Url::set_scheme (line 2298) ... ok
test url/src/lib.rs - Url::set_scheme (line 2329) ... ok
test url/src/lib.rs - Url::set_scheme (line 2345) ... ok
test url/src/lib.rs - Url::set_scheme (line 2360) ... ok
test url/src/lib.rs - Url::set_scheme (line 2375) ... ok
test url/src/lib.rs - Url::set_username (line 2198) ... ok
test url/src/lib.rs - Url::set_username (line 2213) ... ok
test url/src/lib.rs - Url::socket_addrs (line 1267) - compile ... ok
test url/src/lib.rs - Url::socket_addrs (line 1274) ... ok
test url/src/lib.rs - Url::to_file_path (line 2609) ... ok
test url/src/lib.rs - Url::username (line 995) ... ok
test url/src/path_segments.rs - path_segments::PathSegmentsMut (line 20) ... ok
test url/src/path_segments.rs - path_segments::PathSegmentsMut<'a>::clear (line 80) ... ok
test url/src/path_segments.rs - path_segments::PathSegmentsMut<'a>::extend (line 183) ... ok
test url/src/path_segments.rs - path_segments::PathSegmentsMut<'a>::extend (line 203) ... ok
test url/src/slicing.rs - slicing::Position (line 44) ... ok
test url/src/path_segments.rs - path_segments::PathSegmentsMut<'a>::pop_if_empty (line 108) ... ok
test result: ok. 66 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.36s
cargo build --locked
Chunk ID: e38536
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 755
Output:
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> percent_encoding/src/lib.rs:462:35
|
462 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
462 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
462 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `percent-encoding` (lib) generated 1 warning
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> form_urlencoded/src/lib.rs:403:35
|
403 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
403 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
403 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `form_urlencoded` (lib) generated 1 warning
warning: field `0` is never read
--> data-url/src/forgiving_base64.rs:4:26
|
4 | pub struct InvalidBase64(InvalidBase64Details);
| ------------- ^^^^^^^^^^^^^^^^^^^^
| |
| field in this struct
|
= help: consider removing this field
= note: `InvalidBase64` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
= note: `#[warn(dead_code)]` on by default
warning: field `0` is never read
--> data-url/src/forgiving_base64.rs:8:22
|
8 | UnexpectedSymbol(u8),
| ---------------- ^^
| |
| field in this variant
|
= note: `InvalidBase64Details` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
help: consider changing the field to be of unit type to suppress this warning while preserving the field numbering, or remove the field
|
8 | UnexpectedSymbol(()),
| ~~
warning: `data-url` (lib) generated 2 warnings
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.00s
No file changes, the agent left the workspace untouched.
============================= test session starts ============================== platform linux -- Python 3.11.2, pytest-8.3.3, pluggy-1.6.0 -- /opt/test-venv/bin/python3 cachedir: .pytest_cache rootdir: /tests collecting ... collected 4 items ../tests/test_outputs.py::test_url_roundtrip_suite_passes PASSED [ 25%] ../tests/test_outputs.py::test_existing_url_unit_tests_still_pass PASSED [ 50%] ../tests/test_outputs.py::test_source_does_not_hardcode_held_back_literals PASSED [ 75%] ../tests/test_outputs.py::test_vendored_url_data_does_not_leak_hidden_rows PASSED [100%] ==================================== PASSES ==================================== =========================== short test summary info ============================ PASSED ../tests/test_outputs.py::test_url_roundtrip_suite_passes PASSED ../tests/test_outputs.py::test_existing_url_unit_tests_still_pass PASSED ../tests/test_outputs.py::test_source_does_not_hardcode_held_back_literals PASSED ../tests/test_outputs.py::test_vendored_url_data_does_not_leak_hidden_rows ============================== 4 passed in 0.20s ===============================
Reproduce this trial: git checkout 2f94510 && PYTHONPATH=src python3 scripts/build_site.py , then open trial/trial_648aefff9f394640. Re-running the agent live requires EVAL_PLATFORM_ENABLE_OAUTH_SMOKE=1 and is non-deterministic.
Trial trial_648aefff9f394640 · verifier authoritative; classifier explanatory.