@@ -3,6 +3,42 @@ import * as os from 'os';
33import * as path from 'path' ;
44import { getSocketDir } from './daemon.js' ;
55
6+ /**
7+ * HTTP request detection pattern used in daemon.ts to prevent cross-origin attacks.
8+ * This pattern detects HTTP method prefixes that browsers must send when using fetch().
9+ */
10+ const HTTP_REQUEST_PATTERN = / ^ ( G E T | P O S T | P U T | D E L E T E | H E A D | O P T I O N S | P A T C H | C O N N E C T | T R A C E ) \s / i;
11+
12+ describe ( 'HTTP request detection (security)' , ( ) => {
13+ it ( 'should detect POST requests from fetch()' , ( ) => {
14+ const httpRequest = 'POST / HTTP/1.1\r\nHost: 127.0.0.1:51234\r\n' ;
15+ expect ( HTTP_REQUEST_PATTERN . test ( httpRequest . trimStart ( ) ) ) . toBe ( true ) ;
16+ } ) ;
17+
18+ it ( 'should detect GET requests' , ( ) => {
19+ expect ( HTTP_REQUEST_PATTERN . test ( 'GET / HTTP/1.1' ) ) . toBe ( true ) ;
20+ } ) ;
21+
22+ it ( 'should detect OPTIONS preflight requests' , ( ) => {
23+ expect ( HTTP_REQUEST_PATTERN . test ( 'OPTIONS / HTTP/1.1' ) ) . toBe ( true ) ;
24+ } ) ;
25+
26+ it ( 'should NOT detect valid JSON commands' , ( ) => {
27+ const jsonCommand = '{"id":"1","action":"navigate","url":"https://example.com"}' ;
28+ expect ( HTTP_REQUEST_PATTERN . test ( jsonCommand . trimStart ( ) ) ) . toBe ( false ) ;
29+ } ) ;
30+
31+ it ( 'should NOT detect JSON with leading whitespace' , ( ) => {
32+ const jsonCommand = ' {"id":"1","action":"click","selector":"button"}' ;
33+ expect ( HTTP_REQUEST_PATTERN . test ( jsonCommand . trimStart ( ) ) ) . toBe ( false ) ;
34+ } ) ;
35+
36+ it ( 'should be case insensitive for HTTP methods' , ( ) => {
37+ expect ( HTTP_REQUEST_PATTERN . test ( 'post / HTTP/1.1' ) ) . toBe ( true ) ;
38+ expect ( HTTP_REQUEST_PATTERN . test ( 'Post / HTTP/1.1' ) ) . toBe ( true ) ;
39+ } ) ;
40+ } ) ;
41+
642describe ( 'getSocketDir' , ( ) => {
743 const originalEnv = { ...process . env } ;
844
0 commit comments