[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs:api\u002FQuittio\u002FCore\u002FPdf\u002FRemoteImageFetcher":3},{"versions":4,"version":26,"nav":28,"path":106,"kind":107,"page":108},[5,10,13,16,18,20,22,24],{"name":6,"label":7,"prefix":8,"channel":9},"0.7","0.7 (latest)","","latest",{"name":11,"label":12,"prefix":11,"channel":11},"next","next (unreleased)",{"name":14,"label":14,"prefix":14,"channel":15},"0.6","old",{"name":17,"label":17,"prefix":17,"channel":15},"0.5",{"name":19,"label":19,"prefix":19,"channel":15},"0.4",{"name":21,"label":21,"prefix":21,"channel":15},"0.3",{"name":23,"label":23,"prefix":23,"channel":15},"0.2",{"name":25,"label":25,"prefix":25,"channel":15},"0.1",{"name":6,"label":7,"prefix":8,"channel":9,"base":27},"\u002Fdocs",[29,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,91,94,97,100,103],{"slug":30,"title":31,"preview":32},"index","Home",false,{"slug":34,"title":35,"preview":32},"getting-started","Getting started",{"slug":37,"title":38,"preview":32},"concepts","E-invoicing basics",{"slug":40,"title":41,"preview":32},"examples","Examples",{"slug":43,"title":44,"preview":32},"building-invoices","Building invoices",{"slug":46,"title":47,"preview":32},"formats","Formats and profiles",{"slug":49,"title":50,"preview":32},"validation","Validation",{"slug":52,"title":53,"preview":32},"templates","Templates and design",{"slug":55,"title":56,"preview":32},"documents","Quotes and other documents",{"slug":58,"title":59,"preview":32},"reading","Reading incoming invoices",{"slug":61,"title":62,"preview":32},"laravel","Laravel integration",{"slug":64,"title":65,"preview":32},"configuration","Configuration",{"slug":67,"title":68,"preview":32},"commands","Artisan commands",{"slug":70,"title":71,"preview":32},"testing","Testing",{"slug":73,"title":74,"preview":32},"country-packs","Country packs",{"slug":76,"title":77,"parent":74,"preview":32},"country-at","Austria",{"slug":79,"title":80,"parent":74,"preview":32},"country-be","Belgium",{"slug":82,"title":83,"parent":74,"preview":32},"country-ch","Switzerland",{"slug":85,"title":86,"parent":74,"preview":32},"country-fr","France",{"slug":88,"title":89,"preview":90},"managed","Managed layer (preview)",true,{"slug":92,"title":93,"preview":32},"troubleshooting","Troubleshooting",{"slug":95,"title":96,"preview":32},"faq","FAQ",{"slug":98,"title":99,"preview":32},"compatibility","Versioning and compatibility",{"slug":101,"title":102,"preview":32},"field-reference","Field reference",{"slug":104,"title":105,"preview":32},"ai","AI assistants","api\u002FQuittio\u002FCore\u002FPdf\u002FRemoteImageFetcher","api",{"title":109,"description":110,"html":111,"headings":112},"RemoteImageFetcher","Downloads remote logos without server-side request forgery: only http and https, only hosts whose every resolved address (IPv4 and IPv6) is publicly routable, the connection pinned to the checked address (no second DNS lookup) and every redirect checked again.","\u003Cp class=\"q-api-crumbs\">\u003Ca href=\"\u002Fdocs\u002Fapi\">API reference\u003C\u002Fa> \u002F \u003Ca href=\"\u002Fdocs\u002Fapi\u002FQuittio\">Quittio\u003C\u002Fa> \\ \u003Ca href=\"\u002Fdocs\u002Fapi\u002FQuittio\u002FCore\">Core\u003C\u002Fa> \\ \u003Ca href=\"\u002Fdocs\u002Fapi\u002FQuittio\u002FCore\u002FPdf\">Pdf\u003C\u002Fa>\u003C\u002Fp>\n\u003Ch1>RemoteImageFetcher\u003C\u002Fh1>\n\u003Cp class=\"q-api-facts\">\u003Cspan class=\"q-api-badge q-api-badge-kind\">final readonly class\u003C\u002Fspan> in \u003Cspan class=\"q-api-badge\">quittio\u002Fcore\u003C\u002Fspan>\u003C\u002Fp>\n\u003Cp class=\"q-api-name\">\u003Ccode>Quittio\\Core\\Pdf\\RemoteImageFetcher\u003C\u002Fcode> · \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FQuittio\u002Fquittio\u002Fblob\u002Fv0.7.1\u002Fpackages\u002Fcore\u002Fsrc\u002FPdf\u002FRemoteImageFetcher.php#L15\">Source\u003C\u002Fa>\u003C\u002Fp>\n\n\u003Cp class=\"q-doc-lead\">Downloads remote logos without server-side request forgery: only http and https, only hosts whose every resolved address (IPv4 and IPv6) is publicly routable, the connection pinned to the checked address (no second DNS lookup) and every redirect checked again.\u003C\u002Fp>\n\n\u003Ch2 id=\"methods\">Methods\u003Ca class=\"q-doc-anchor\" href=\"#methods\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Ctable class=\"q-doc-table q-stack-table q-api-summary\">\u003Cthead>\u003Ctr>\u003Cth>Method\u003C\u002Fth>\u003Cth>Description\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\n\u003Ctr>\u003Ctd>\u003Ca href=\"#method-__construct\">\u003Ccode>->__construct()\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\u003Ctd data-label=\"Description\">\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ca href=\"#method-fetch\">\u003Ccode>->fetch()\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\u003Ctd data-label=\"Description\">Content of the image, or null if it cannot be downloaded.\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ca href=\"#method-isPublicAddress\">\u003Ccode>::isPublicAddress()\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\u003Ctd data-label=\"Description\">Whether the address is publicly routable: no loopback, private, link-local, shared, reserved, documentation or multicast range, also not embedded in an IPv6 address.\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Csection class=\"q-api-member\" id=\"method-__construct\">\n\u003Ch3>\u003Ccode>__construct()\u003C\u002Fcode>\u003Ca class=\"q-doc-anchor\" href=\"#method-__construct\" aria-label=\"Link to this method\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cdiv class=\"q-doc-code q-doc-code-plain\">\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">public\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> function\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> __construct\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    int\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $maxBytes \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> 10\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> * \u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">1024\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> * \u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">1024\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    int\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $timeout \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> 10\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    int\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $maxRedirects \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> 3\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    (Closure(string): list&#x3C;string>)|\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">null\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $resolver \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> null\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    (Closure(string, string, string)\u003C\u002Fspan>\u003Cspan style=\"color:#FFA198;font-style:italic\">: (array\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">{\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">status\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">int\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">location\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">?string\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">body\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> string\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">}\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">|\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">null\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">))\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">|\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">null\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $transport \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> null\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\n\n\u003Ctable class=\"q-doc-table q-stack-table\">\u003Cthead>\u003Ctr>\u003Cth>Parameter\u003C\u002Fth>\u003Cth>Type\u003C\u002Fth>\u003Cth>Description\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\n\u003Ctr>\u003Ctd>\u003Ccode>$maxBytes\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd data-label=\"Type\">\u003Ccode>int\u003C\u002Fcode>\u003Cspan class=\"q-api-default\"> = \u003Ccode>10 * 1024 * 1024\u003C\u002Fcode>\u003C\u002Fspan>\u003C\u002Ftd>\u003Ctd data-label=\"Description\">\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>$timeout\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd data-label=\"Type\">\u003Ccode>int\u003C\u002Fcode>\u003Cspan class=\"q-api-default\"> = \u003Ccode>10\u003C\u002Fcode>\u003C\u002Fspan>\u003C\u002Ftd>\u003Ctd data-label=\"Description\">\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>$maxRedirects\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd data-label=\"Type\">\u003Ccode>int\u003C\u002Fcode>\u003Cspan class=\"q-api-default\"> = \u003Ccode>3\u003C\u002Fcode>\u003C\u002Fspan>\u003C\u002Ftd>\u003Ctd data-label=\"Description\">\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>$resolver\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd data-label=\"Type\">\u003Ccode>(Closure(string): list&lt;string&gt;)|null\u003C\u002Fcode>\u003Cspan class=\"q-api-default\"> = \u003Ccode>null\u003C\u002Fcode>\u003C\u002Fspan>\u003C\u002Ftd>\u003Ctd data-label=\"Description\">host name =&gt; IP addresses\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>$transport\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd data-label=\"Type\">\u003Ccode>(Closure(string, string, string): (array{status: int, location: ?string, body: string}|null))|null\u003C\u002Fcode>\u003Cspan class=\"q-api-default\"> = \u003Ccode>null\u003C\u002Fcode>\u003C\u002Fspan>\u003C\u002Ftd>\u003Ctd data-label=\"Description\">URL, host, pinned IP =&gt; response, null on failure\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003C\u002Fsection>\n\u003Csection class=\"q-api-member\" id=\"method-fetch\">\n\u003Ch3>\u003Ccode>fetch()\u003C\u002Fcode>\u003Ca class=\"q-doc-anchor\" href=\"#method-fetch\" aria-label=\"Link to this method\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cdiv class=\"q-doc-code q-doc-code-plain\">\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">public\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> function\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\"> fetch\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">string\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $url)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> ?string\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\n\u003Cp>Content of the image, or null if it cannot be downloaded.\u003C\u002Fp>\n\n\u003Ctable class=\"q-doc-table q-stack-table\">\u003Cthead>\u003Ctr>\u003Cth>Parameter\u003C\u002Fth>\u003Cth>Type\u003C\u002Fth>\u003Cth>Description\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\n\u003Ctr>\u003Ctd>\u003Ccode>$url\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd data-label=\"Type\">\u003Ccode>string\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd data-label=\"Description\">\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cdl class=\"q-api-dl\">\n\u003Cdt>Returns\u003C\u002Fdt>\u003Cdd>\u003Ccode>?string\u003C\u002Fcode>\u003C\u002Fdd>\n\u003Cdt>Throws\u003C\u002Fdt>\u003Cdd>\u003Ccode>\u003Ca href=\"\u002Fdocs\u002Fapi\u002FQuittio\u002FCore\u002FExceptions\u002FConfigurationException\">ConfigurationException\u003C\u002Fa>\u003C\u002Fcode> – for URLs that are not allowed (scheme, non-public address)\u003C\u002Fdd>\n\u003C\u002Fdl>\n\u003C\u002Fsection>\n\u003Csection class=\"q-api-member\" id=\"method-isPublicAddress\">\n\u003Ch3>\u003Ccode>isPublicAddress()\u003C\u002Fcode>\u003Ca class=\"q-doc-anchor\" href=\"#method-isPublicAddress\" aria-label=\"Link to this method\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cdiv class=\"q-doc-code q-doc-code-plain\">\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">public\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> static\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> function\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\"> isPublicAddress\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">string\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $ip)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> bool\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp class=\"q-api-tags\">\u003Cspan class=\"q-api-badge\">static\u003C\u002Fspan>\u003C\u002Fp>\n\n\u003Cp>Whether the address is publicly routable: no loopback, private, link-local, shared, reserved, documentation or multicast range, also not embedded in an IPv6 address.\u003C\u002Fp>\n\n\u003Ctable class=\"q-doc-table q-stack-table\">\u003Cthead>\u003Ctr>\u003Cth>Parameter\u003C\u002Fth>\u003Cth>Type\u003C\u002Fth>\u003Cth>Description\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\n\u003Ctr>\u003Ctd>\u003Ccode>$ip\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd data-label=\"Type\">\u003Ccode>string\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd data-label=\"Description\">\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cdl class=\"q-api-dl\">\n\u003Cdt>Returns\u003C\u002Fdt>\u003Cdd>\u003Ccode>bool\u003C\u002Fcode>\u003C\u002Fdd>\n\u003C\u002Fdl>\n\u003C\u002Fsection>",[113],{"id":114,"text":115,"level":116},"methods","Methods",2]