Calling a study directly does not work

Describe Your Question

  • I want to call a specific study directly via link. For example “http://localhost:3000/viewer?StudyInstanceUIDs=1.113654.3.13.1026
  • But i get a 404
  • When i go normally from localhost:3000 and naviage to the study its there.
  • It tries to find the /viewer path which isnt there. I printed what is in my dist directory below
  • I use OHIF Version 3 stable

Additional Info

I also tried to just run it with a standard javascript http server. Also did not work

What steps can we follow to reproduce the bug?

  1. yarn run build
  2. Copy the dist folder to a the directory with the go file
  3. go build -buildmode=exe
  4. Start OHIF (with a dicomweb server running at whatever you give as output url)
  5. Call a study directly via link from the browser

Here is the full code of my http server (and reverse proxy) in golang. Maybe i just do something wrong…

package main

import (
	"bytes"
	"embed"
	_ "embed"
	"fmt"
	"log"
	"net/http"
	"net/http/httputil"
	"net/url"
	"os"
	"time"
)

var (
	//go:embed dist/*
	userInterface embed.FS
)

type ClosingBuffer struct{ *bytes.Buffer }

func (cb *ClosingBuffer) Close() error { return nil }

func main() {
	// Parse command-line arguments for the input and output URLs
	if len(os.Args) != 3 {
		log.Fatalf("Usage: %s <input URL> <output URL>", os.Args[0])
	}
	inputURLStr := os.Args[1]
	outputURLStr := os.Args[2]

	// Parse the input and output URLs
	inputURL, err := url.Parse(inputURLStr)
	if err != nil {
		log.Fatal(err)
	}
	outputURL, err := url.Parse(outputURLStr)
	if err != nil {
		log.Fatal(err)
	}

	// Create the reverse proxy
	proxy := httputil.NewSingleHostReverseProxy(outputURL)

	// Reverse proxy handler
	proxyHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		// Set CORS headers to allow any origin
		w.Header().Set("Access-Control-Allow-Origin", "*")
		w.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS, PUT, DELETE")
		w.Header().Set("Access-Control-Allow-Headers", "Origin, Content-Type, Authorization")

		// Serve the request through the reverse proxy
		proxy.ServeHTTP(w, r)
	})

	// UI handler
	uiHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		// Set CORS headers to allow any origin
		w.Header().Set("Access-Control-Allow-Origin", "*")
		w.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS, PUT, DELETE")
		w.Header().Set("Access-Control-Allow-Headers", "Origin, Content-Type, Authorization")
		w.Header().Set("Cross-Origin-Embedder-Policy", "require-corp")
		w.Header().Set("Cross-Origin-Opener-Policy", "same-origin")
		// Serve the UI using embedded files
		if r.URL.Path == "/" {
			r.URL.Path = "/index.html"
		}
		fmt.Println(r.URL.Path)
		content, err := userInterface.ReadFile("dist" + r.URL.Path)
		if err != nil {
			http.NotFound(w, r)
			return
		}
		http.ServeContent(w, r, r.URL.Path, time.Now(), bytes.NewReader(content))
	})

	// Create a new HTTP server for port 8080
	serverProxy := http.Server{
		Addr:    ":" + inputURL.Port(), // incoming port from input URL
		Handler: proxyHandler,
	}

	// Create a new HTTP server for port 3000
	serverUI := http.Server{
		Addr:    ":3000",
		Handler: uiHandler,
	}

	// Start both HTTP servers
	fmt.Println(fmt.Sprintf("Starting HTTP server on port %s...", inputURL.Port()))
	go func() {
		if err := serverProxy.ListenAndServe(); err != nil {
			fmt.Println(err)
		}
	}()
	fmt.Println("Starting HTTP server on port 3000...")
	if err := serverUI.ListenAndServe(); err != nil {
		fmt.Println(err)
	}
}

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        21.03.2023     14:47                assets
-a----        21.03.2023     14:46         145700 5004fdc02f329ce53b69.wasm
-a----        21.03.2023     14:46          21482 610.min.worker.js
-a----        21.03.2023     14:46          86994 610.min.worker.js.map
-a----        21.03.2023     14:46         249148 65916ef3def695744bda.wasm
-a----        21.03.2023     14:46         204778 75788f12450d4c5ed494.wasm
-a----        21.03.2023     14:46          10478 888.min.worker.js
-a----        21.03.2023     14:46          56240 888.min.worker.js.map
-a----        21.03.2023     14:46           5683 app-config.js
-a----        21.03.2023     14:46       16384917 app.js
-a----        21.03.2023     14:46       15651313 app.js.map
-a----        21.03.2023     14:46         178739 c22b37c3488e1d6c3aa4.wasm
-a----        21.03.2023     14:46         122749 cornerstoneWADOImageLoader.min.js
-a----        21.03.2023     14:46         620151 cornerstoneWADOImageLoader.min.js.map
-a----        21.03.2023     14:46          57639 es6-shim.min.js
-a----        21.03.2023     14:46          34172 extensions_cornerstone-dicom-seg_src_viewports_OHIFCornerstoneSEGView
                                                  port_tsx.js
-a----        21.03.2023     14:46          24582 extensions_cornerstone-dicom-seg_src_viewports_OHIFCornerstoneSEGView
                                                  port_tsx.js.map
-a----        21.03.2023     14:46          24945 extensions_cornerstone-dicom-sr_src_viewports_OHIFCornerstoneSRViewpo
                                                  rt_tsx.js
-a----        21.03.2023     14:46          20872 extensions_cornerstone-dicom-sr_src_viewports_OHIFCornerstoneSRViewpo
                                                  rt_tsx.js.map
-a----        21.03.2023     14:46         102245 extensions_cornerstone_src_Viewport_OHIFCornerstoneViewport_tsx.js
-a----        21.03.2023     14:46          77231 extensions_cornerstone_src_Viewport_OHIFCornerstoneViewport_tsx.js.ma
                                                  p
-a----        21.03.2023     14:46           3785 extensions_dicom-pdf_src_viewports_OHIFCornerstonePdfViewport_tsx.js
-a----        21.03.2023     14:46           1608 extensions_dicom-pdf_src_viewports_OHIFCornerstonePdfViewport_tsx.js.
                                                  map
-a----        21.03.2023     14:46           4242 extensions_dicom-video_src_viewports_OHIFCornerstoneVideoViewport_tsx
                                                  .js
-a----        21.03.2023     14:46           2044 extensions_dicom-video_src_viewports_OHIFCornerstoneVideoViewport_tsx
                                                  .js.map
-a----        21.03.2023     14:46          14110 extensions_measurement-tracking_src_viewports_TrackedCornerstoneViewp
                                                  ort_tsx.js
-a----        21.03.2023     14:46          10664 extensions_measurement-tracking_src_viewports_TrackedCornerstoneViewp
                                                  ort_tsx.js.map
-a----        21.03.2023     14:46          27008 extensions_test-extension_src_index_tsx.js
-a----        21.03.2023     14:46          15680 extensions_test-extension_src_index_tsx.js.map
-a----        21.03.2023     14:46           2654 google.js
-a----        21.03.2023     14:46           6733 index.html
-a----        21.03.2023     14:46         197208 index.worker.min.worker.js
-a----        21.03.2023     14:46         729324 index.worker.min.worker.js.map
-a----        21.03.2023     14:46           2005 init-service-worker.js
-a----        21.03.2023     14:46           1369 manifest.json
-a----        21.03.2023     14:46          35632 modes_basic-test-mode_src_index_js.js
-a----        21.03.2023     14:46          36145 modes_basic-test-mode_src_index_js.js.map
-a----        21.03.2023     14:46          16558 ohif-logo-light.svg
-a----        21.03.2023     14:46          16567 ohif-logo.svg
-a----        21.03.2023     14:46         246169 oidc-client.min.js
-a----        21.03.2023     14:46           3138 polyfill.min.js
-a----        21.03.2023     14:46            595 silent-refresh.html
-a----        21.03.2023     14:46          10940 sw.js
-a----        21.03.2023     14:46           2733 sw.js.map
-a----        21.03.2023     14:46          33686 vendors-node_modules_react-resize-detector_build_index_esm_js.js
-a----        21.03.2023     14:46          37850 vendors-node_modules_react-resize-detector_build_index_esm_js.js.map
-a----        21.03.2023     14:46            264 _headers
-a----        21.03.2023     14:46            155 _redirects

The solution is to reroute every 404 error to index.html

I stumbled upon the same issue, how did you redirect the 404 to index.html?

My webserver is Apache24.

As i am programming my webserver myself with golang i just created a function to do so. I dont know how to do it with apache