Skip to content

fix: SsrCookieService to support Express request objects in Angular SSR - #361

Closed
pavankjadda with Copilot wants to merge 3 commits into
masterfrom
copilot/fix-346
Closed

fix: SsrCookieService to support Express request objects in Angular SSR#361
pavankjadda with Copilot wants to merge 3 commits into
masterfrom
copilot/fix-346

Conversation

Copilot AI commented Aug 5, 2025

Copy link
Copy Markdown

The SsrCookieService was failing when users passed Express request objects directly to Angular's REQUEST token during server-side rendering. The service expected Angular's REQUEST object which has a headers.get() method, but Express request objects have a different API structure.

Error encountered:

this.request.headers.get is not a function

Root cause:
The service was calling this.request?.headers.get('cookie') in three places (check(), get(), and getAll() methods), but Express request objects don't have a headers.get() method. Instead, they have:

  • req.get('cookie') method for getting headers
  • req.headers.cookie property for direct header access

Solution:
Added a private getCookieHeader() method that safely handles multiple request object types:

  1. Angular REQUEST objects - Uses headers.get('cookie') method
  2. Express request objects - Uses get('cookie') method with fallback to get('Cookie')
  3. Plain request objects - Uses direct headers.cookie or headers.Cookie property access

The fix maintains backward compatibility while adding support for Express request objects commonly used in Angular Universal SSR setups.

Changes:

  • Added getCookieHeader() private method with type-safe request handling
  • Replaced three instances of this.request?.headers.get('cookie') with the new helper
  • Fixed import issue by defining SameSite type locally
  • Added comprehensive unit tests covering all request object types

Usage example that now works:

server.get('*', (req, res) => {
  commonEngine.render({
    bootstrap,
    providers: [
      { provide: REQUEST, useValue: req } // Express req object now works
    ]
  });
});

Fixes #346.

Warning

Firewall rules blocked me from connecting to one or more addresses

I tried to connect to the following addresses, but was blocked by firewall rules:

  • accounts.google.com
    • Triggering command: /opt/google/chrome/chrome --type=utility --utility-sub-type=network.mojom.NetworkService --lang=en-US --service-sandbox-type=none --disable-dev-shm-usage --use-angle=swiftshader-webgl --crashpad-handler-pid=3458 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/karma-31405678 --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,15117442920883301777,5975249126760531825,262144 --disable-features=PaintHolding --variations-seed-version (dns block)
    • Triggering command: /opt/google/chrome/chrome --user-data-dir=/tmp/karma-31405678 --enable-automation --no-default-browser-check --no-first-run --disable-default-apps --disable-popup-blocking --disable-translate --disable-REDACTED-timer-throttling --disable-renderer-REDACTEDing --disable-device-discovery-notifications --headless --disable-gpu --disable-dev-shm-usage --remote-debugging-port=9222 --noerrdialogs --ozone-platform=headless --ozone-override-screen-size=800,600 --use-angle=swiftshader-webgl http://localhost:9876/?id=31405678 (dns block)
    • Triggering command: /opt/google/chrome/chrome --type=utility --utility-sub-type=network.mojom.NetworkService --lang=en-US --service-sandbox-type=none --disable-dev-shm-usage --use-angle=swiftshader-webgl --crashpad-handler-pid=3929 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/karma-35746611 --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,4279227157114855908,17699770739712919255,262144 --disable-features=PaintHolding --variations-seed-version (dns block)
  • clients2.google.com
    • Triggering command: /opt/google/chrome/chrome --type=utility --utility-sub-type=network.mojom.NetworkService --lang=en-US --service-sandbox-type=none --disable-dev-shm-usage --use-angle=swiftshader-webgl --crashpad-handler-pid=3458 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/karma-31405678 --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,15117442920883301777,5975249126760531825,262144 --disable-features=PaintHolding --variations-seed-version (dns block)
    • Triggering command: /opt/google/chrome/chrome --user-data-dir=/tmp/karma-31405678 --enable-automation --no-default-browser-check --no-first-run --disable-default-apps --disable-popup-blocking --disable-translate --disable-REDACTED-timer-throttling --disable-renderer-REDACTEDing --disable-device-discovery-notifications --headless --disable-gpu --disable-dev-shm-usage --remote-debugging-port=9222 --noerrdialogs --ozone-platform=headless --ozone-override-screen-size=800,600 --use-angle=swiftshader-webgl http://localhost:9876/?id=31405678 (dns block)
    • Triggering command: /opt/google/chrome/chrome --user-data-dir=/tmp/karma-35746611 --enable-automation --no-default-browser-check --no-first-run --disable-default-apps --disable-popup-blocking --disable-translate --disable-REDACTED-timer-throttling --disable-renderer-REDACTEDing --disable-device-discovery-notifications --headless --disable-gpu --disable-dev-shm-usage --remote-debugging-port=9222 --noerrdialogs --ozone-platform=headless --ozone-override-screen-size=800,600 --use-angle=swiftshader-webgl http://localhost:9876/?id=35746611 (dns block)
  • clientservices.googleapis.com
    • Triggering command: /opt/google/chrome/chrome --type=utility --utility-sub-type=network.mojom.NetworkService --lang=en-US --service-sandbox-type=none --disable-dev-shm-usage --use-angle=swiftshader-webgl --crashpad-handler-pid=3458 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/karma-31405678 --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,15117442920883301777,5975249126760531825,262144 --disable-features=PaintHolding --variations-seed-version (dns block)
    • Triggering command: /opt/google/chrome/chrome --user-data-dir=/tmp/karma-31405678 --enable-automation --no-default-browser-check --no-first-run --disable-default-apps --disable-popup-blocking --disable-translate --disable-REDACTED-timer-throttling --disable-renderer-REDACTEDing --disable-device-discovery-notifications --headless --disable-gpu --disable-dev-shm-usage --remote-debugging-port=9222 --noerrdialogs --ozone-platform=headless --ozone-override-screen-size=800,600 --use-angle=swiftshader-webgl http://localhost:9876/?id=31405678 (dns block)
    • Triggering command: /opt/google/chrome/chrome --type=utility --utility-sub-type=network.mojom.NetworkService --lang=en-US --service-sandbox-type=none --disable-dev-shm-usage --use-angle=swiftshader-webgl --crashpad-handler-pid=3929 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/karma-35746611 --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,4279227157114855908,17699770739712919255,262144 --disable-features=PaintHolding --variations-seed-version (dns block)
  • redirector.gvt1.com
    • Triggering command: /opt/google/chrome/chrome --type=utility --utility-sub-type=network.mojom.NetworkService --lang=en-US --service-sandbox-type=none --disable-dev-shm-usage --use-angle=swiftshader-webgl --crashpad-handler-pid=3458 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/karma-31405678 --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,15117442920883301777,5975249126760531825,262144 --disable-features=PaintHolding --variations-seed-version (dns block)
    • Triggering command: /opt/google/chrome/chrome --user-data-dir=/tmp/karma-31405678 --enable-automation --no-default-browser-check --no-first-run --disable-default-apps --disable-popup-blocking --disable-translate --disable-REDACTED-timer-throttling --disable-renderer-REDACTEDing --disable-device-discovery-notifications --headless --disable-gpu --disable-dev-shm-usage --remote-debugging-port=9222 --noerrdialogs --ozone-platform=headless --ozone-override-screen-size=800,600 --use-angle=swiftshader-webgl http://localhost:9876/?id=31405678 (dns block)
    • Triggering command: /opt/google/chrome/chrome --type=utility --utility-sub-type=network.mojom.NetworkService --lang=en-US --service-sandbox-type=none --disable-dev-shm-usage --use-angle=swiftshader-webgl --crashpad-handler-pid=3929 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/karma-35746611 --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,4279227157114855908,17699770739712919255,262144 --disable-features=PaintHolding --variations-seed-version (dns block)
  • safebrowsingohttpgateway.googleapis.com
    • Triggering command: /opt/google/chrome/chrome --user-data-dir=/tmp/karma-31405678 --enable-automation --no-default-browser-check --no-first-run --disable-default-apps --disable-popup-blocking --disable-translate --disable-REDACTED-timer-throttling --disable-renderer-REDACTEDing --disable-device-discovery-notifications --headless --disable-gpu --disable-dev-shm-usage --remote-debugging-port=9222 --noerrdialogs --ozone-platform=headless --ozone-override-screen-size=800,600 --use-angle=swiftshader-webgl http://localhost:9876/?id=31405678 (dns block)
    • Triggering command: /opt/google/chrome/chrome --type=utility --utility-sub-type=network.mojom.NetworkService --lang=en-US --service-sandbox-type=none --disable-dev-shm-usage --use-angle=swiftshader-webgl --crashpad-handler-pid=3458 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/karma-31405678 --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,15117442920883301777,5975249126760531825,262144 --disable-features=PaintHolding --variations-seed-version (dns block)
    • Triggering command: /opt/google/chrome/chrome --type=utility --utility-sub-type=network.mojom.NetworkService --lang=en-US --service-sandbox-type=none --disable-dev-shm-usage --use-angle=swiftshader-webgl --crashpad-handler-pid=3929 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/karma-35746611 --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,4279227157114855908,17699770739712919255,262144 --disable-features=PaintHolding --variations-seed-version (dns block)
  • www.google-analytics.com
    • Triggering command: ng test ngx-cookie-service --watch=false --browsers=ChromeHeadless (dns block)
    • Triggering command: ng test ngx-cookie-service-ssr (dns block)
    • Triggering command: ng build ngx-cookie-service-ssr (dns block)

If you need me to access, download, or install something from one of these locations, you can either:


💬 Share your feedback on Copilot coding agent for the chance to win a $200 gift card! Click here to start the survey.

Copilot AI and others added 2 commits August 5, 2025 21:07
…est objects

Co-authored-by: pavankjadda <17564080+pavankjadda@users.noreply.github.com>
Co-authored-by: pavankjadda <17564080+pavankjadda@users.noreply.github.com>
@sonarqubecloud

sonarqubecloud Bot commented Aug 5, 2025

Copy link
Copy Markdown

Copilot AI changed the title [WIP] this.request.headers.get is no a function Fix SsrCookieService to support Express request objects in Angular SSR Aug 5, 2025
Copilot AI requested a review from pavankjadda August 5, 2025 21:10
@pavankjadda pavankjadda changed the title Fix SsrCookieService to support Express request objects in Angular SSR fix: SsrCookieService to support Express request objects in Angular SSR Aug 5, 2025
@pavankjadda

Copy link
Copy Markdown
Collaborator

Closes in favor of #362

@pavankjadda pavankjadda closed this Aug 5, 2025
@pavankjadda
pavankjadda deleted the copilot/fix-346 branch November 19, 2025 21:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

this.request.headers.get is no a function

2 participants