From 6065843fd01d129b74685ef0036bec29b2d22fea Mon Sep 17 00:00:00 2001 From: "Brian \"Moses\" Hall" Date: Thu, 18 Jun 2026 11:06:28 -0400 Subject: [PATCH 1/3] Disable epub download. --- imgsrv/apps/download.psgi | 2 +- imgsrv/lib/SRV/Utils.pm | 2 +- imgsrv/lib/SRV/Volume/EPUB.pm | 1 + imgsrv/t/plack.t | 26 +++--- pt/lib/PT/PIFiller/Common.pm | 8 +- pt/web/firebird/tests/imgsrv_download.spec.js | 90 +++++++++---------- 6 files changed, 65 insertions(+), 64 deletions(-) diff --git a/imgsrv/apps/download.psgi b/imgsrv/apps/download.psgi index 9fdc80e21..7b9f08ccd 100644 --- a/imgsrv/apps/download.psgi +++ b/imgsrv/apps/download.psgi @@ -88,7 +88,7 @@ builder { mount "/" => $app; mount "/volume" => builder { mount "/pdf" => $loader->('SRV::Volume::PDF'); - mount "/epub" => $loader->('SRV::Volume::EPUB'); + #mount "/epub" => $loader->('SRV::Volume::EPUB'); mount "/plaintext" => $loader->('SRV::Volume::Text::Bundle'); mount "/image" => $loader->('SRV::Volume::Image::Bundle'); mount "/remediated" => $loader->('SRV::Volume::Remediated::Bundle'); diff --git a/imgsrv/lib/SRV/Utils.pm b/imgsrv/lib/SRV/Utils.pm index e72e4d3cc..bc3c6517a 100644 --- a/imgsrv/lib/SRV/Utils.pm +++ b/imgsrv/lib/SRV/Utils.pm @@ -475,7 +475,7 @@ sub parse_env { $path_info =~ s,.*/$id/,,; my $format; - if ( $path_info =~ m,\.jpg$|\.tif$|\.png|\.pdf|\.epub$, ) { + if ( $path_info =~ m,\.jpg$|\.tif$|\.png|\.pdf$, ) { my $ridx = rindex($path_info, '.'); $format = substr($path_info, $ridx + 1); $path_info = substr($path_info, 0, $ridx) . "/$format"; diff --git a/imgsrv/lib/SRV/Volume/EPUB.pm b/imgsrv/lib/SRV/Volume/EPUB.pm index cc18357d1..a5bcc01c2 100644 --- a/imgsrv/lib/SRV/Volume/EPUB.pm +++ b/imgsrv/lib/SRV/Volume/EPUB.pm @@ -82,6 +82,7 @@ sub new { sub call { my ( $self, $env ) = @_; + die('epub disabled'); my $req = Plack::Request->new($env); if ( my $num_attempts = $req->param('num_attempts') ) { diff --git a/imgsrv/t/plack.t b/imgsrv/t/plack.t index fc0c084c8..8267b6d3d 100755 --- a/imgsrv/t/plack.t +++ b/imgsrv/t/plack.t @@ -109,19 +109,19 @@ subtest "download.psgi" => sub { }; }; - subtest "volume/epub" => sub { - subtest "with callback" => sub { - my $res = $test->request(GET "/epub?id=test.pd_open&callback=1"); - is $res->message, 'OK'; - is $res->header('Content-Type'), 'application/javascript'; - }; - - subtest "without callback" => sub { - my $res = $test->request(GET "/epub?id=test.pd_open"); - is $res->message, 'OK'; - is $res->header('Content-Type'), 'application/epub+zip'; - }; - }; + #subtest "volume/epub" => sub { + # subtest "with callback" => sub { + # my $res = $test->request(GET "/epub?id=test.pd_open&callback=1"); + # is $res->message, 'OK'; + # is $res->header('Content-Type'), 'application/javascript'; + # }; + + # subtest "without callback" => sub { + # my $res = $test->request(GET "/epub?id=test.pd_open"); + # is $res->message, 'OK'; + # is $res->header('Content-Type'), 'application/epub+zip'; + # }; + #}; subtest "volume/plaintext" => sub { my $res = $test->request(GET "/plaintext?id=test.pd_open"); diff --git a/pt/lib/PT/PIFiller/Common.pm b/pt/lib/PT/PIFiller/Common.pm index 60ba9ae7e..8ccb979b1 100644 --- a/pt/lib/PT/PIFiller/Common.pm +++ b/pt/lib/PT/PIFiller/Common.pm @@ -64,8 +64,8 @@ sub BuildViewTypeUrl if ( $view eq 'fpdf' || $view eq 'pdf' ) { return BuildImageServerPDFUrl($cgi, $view); - } elsif ( $view eq 'epub' ) { - return BuildImageServerPDFUrl($cgi, $view); + #} elsif ( $view eq 'epub' ) { + # return BuildImageServerPDFUrl($cgi, $view); } $tempCgi->delete('ui'); # clear ui=embed @@ -96,8 +96,8 @@ sub BuildImageServerPDFUrl $tempCgi->param('num', scalar $cgi->param('num')); $tempCgi->param('attachment', 0); $action = "download/pdf"; - } elsif ( $view eq 'epub' ) { - $action = 'download/epub'; + #} elsif ( $view eq 'epub' ) { + # $action = 'download/epub'; } if ( $cgi->param('debug') ) { diff --git a/pt/web/firebird/tests/imgsrv_download.spec.js b/pt/web/firebird/tests/imgsrv_download.spec.js index 86d4ac8e4..41f7ffeab 100644 --- a/pt/web/firebird/tests/imgsrv_download.spec.js +++ b/pt/web/firebird/tests/imgsrv_download.spec.js @@ -57,51 +57,51 @@ test.describe('imgsrv download', () => { expect(downloadBody.length).toBeGreaterThan(512 * 1024); }); - test('download epub', async ({ request, page }) => { - var currentTime = new Date().getTime(); - - const initialResponse = await request.get( - 'http://apache:8080/cgi/imgsrv/download/epub?id=test.pd_open&callback=tunnelCallback&_=' + currentTime - ); - const initialBody = await initialResponse.text(); - - const callbackParams = JSON.parse( - initialBody - .replace(/^tunnelCallback\(/, '[') - .replace(/\);$/, ']') - .replaceAll("'", '"') - ); - - const callbackUrl = callbackParams[0]; - const downloadUrl = callbackParams[1]; - - // wait until status is done - let done = false; - - while (done == false) { - const callbackResponse = await request.get('http://apache:8080' + callbackUrl); - const callbackJson = await callbackResponse.json(); - - if (callbackJson.status == 'DONE') { - done = true; - } else { - // wait for 1 second - // await page.waitForTimeout(1000); - // yes it's polling and polling is bad but that's the way imgsrv works 😿 - const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); - await delay(1000); - } - } - - const downloadResponse = await request.get('http://apache:8080' + downloadUrl); - const downloadHeaders = downloadResponse.headers(); - const downloadBody = await downloadResponse.text(); - - expect(downloadResponse.status()).toEqual(200); - expect(downloadHeaders['content-disposition']).toEqual('attachment; filename=test-pd_open.epub'); - expect(downloadHeaders['content-type']).toEqual('application/epub+zip'); - expect(downloadBody.length).toBeGreaterThan(0); - }); + // test('download epub', async ({ request, page }) => { +// var currentTime = new Date().getTime(); +// +// const initialResponse = await request.get( +// 'http://apache:8080/cgi/imgsrv/download/epub?id=test.pd_open&callback=tunnelCallback&_=' + currentTime +// ); +// const initialBody = await initialResponse.text(); +// +// const callbackParams = JSON.parse( +// initialBody +// .replace(/^tunnelCallback\(/, '[') +// .replace(/\);$/, ']') +// .replaceAll("'", '"') +// ); +// +// const callbackUrl = callbackParams[0]; +// const downloadUrl = callbackParams[1]; +// +// // wait until status is done +// let done = false; +// +// while (done == false) { +// const callbackResponse = await request.get('http://apache:8080' + callbackUrl); +// const callbackJson = await callbackResponse.json(); +// +// if (callbackJson.status == 'DONE') { +// done = true; +// } else { +// // wait for 1 second +// // await page.waitForTimeout(1000); +// // yes it's polling and polling is bad but that's the way imgsrv works 😿 +// const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); +// await delay(1000); +// } +// } +// +// const downloadResponse = await request.get('http://apache:8080' + downloadUrl); +// const downloadHeaders = downloadResponse.headers(); +// const downloadBody = await downloadResponse.text(); +// +// expect(downloadResponse.status()).toEqual(200); +// expect(downloadHeaders['content-disposition']).toEqual('attachment; filename=test-pd_open.epub'); +// expect(downloadHeaders['content-type']).toEqual('application/epub+zip'); +// expect(downloadBody.length).toBeGreaterThan(0); +// }); test('download single tiff current page, full resolution', async ({ request, page }) => { // no callback tunnel on single tiff From c8fbbd4014fc28bcb2a19723b0ae90377ec63e7f Mon Sep 17 00:00:00 2001 From: "Brian \"Moses\" Hall" Date: Thu, 18 Jun 2026 11:28:57 -0400 Subject: [PATCH 2/3] Pin to old version of image --- common/docker/core.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/docker/core.yml b/common/docker/core.yml index 0164640e1..2ac2710c7 100644 --- a/common/docker/core.yml +++ b/common/docker/core.yml @@ -9,7 +9,7 @@ x-healthcheck-defaults: &healthcheck-defaults services: solr-sdr-catalog: # This is a core service - image: ghcr.io/hathitrust/catalog-solr-sample + image: ghcr.io/hathitrust/catalog-solr-sample:399beb50c4ab83d963abde50c349029c95182132 ports: - "9033:9033" volumes: From 825a69418b46987785ed7e9cc4e88646e229bd78 Mon Sep 17 00:00:00 2001 From: "Brian \"Moses\" Hall" Date: Thu, 18 Jun 2026 12:13:44 -0400 Subject: [PATCH 3/3] Incorporate UI changes from https://github.com/hathitrust/babel/pull/227 --- pt/web/2021/common.xsl | 7 ------ .../js/components/DownloadPanel/index.svelte | 24 ++++--------------- 2 files changed, 5 insertions(+), 26 deletions(-) diff --git a/pt/web/2021/common.xsl b/pt/web/2021/common.xsl index 5769bdd7c..39e90c4cc 100644 --- a/pt/web/2021/common.xsl +++ b/pt/web/2021/common.xsl @@ -1257,13 +1257,6 @@ - -
- - -
-
-
diff --git a/pt/web/firebird/src/js/components/DownloadPanel/index.svelte b/pt/web/firebird/src/js/components/DownloadPanel/index.svelte index 13d9254a9..75eef7062 100644 --- a/pt/web/firebird/src/js/components/DownloadPanel/index.svelte +++ b/pt/web/firebird/src/js/components/DownloadPanel/index.svelte @@ -12,7 +12,6 @@ const formatTitle = $state({}); formatTitle['pdf'] = 'PDF'; - formatTitle['epub'] = 'EPUB'; formatTitle['plaintext'] = 'Text (.txt)'; formatTitle['plaintext-zip'] = 'Text (.zip)'; formatTitle['image-jpeg'] = 'Image (JPEG)'; @@ -423,7 +422,7 @@ } $effect(() => { - if ((format == 'plaintext-zip' || format == 'epub') && range != 'volume') { + if (format == 'plaintext-zip' && range != 'volume') { range = 'volume'; } }); @@ -526,19 +525,6 @@ />
- {#if manifest.allowFullDownload} -
- - -
- {/if}