Mercurial > hg > nginx-tests
annotate proxy_websocket.t @ 431:05c46688b54b
Tests: ssl_password_file.t fixes.
Make sure to always specify listen socket in all servers as the
default vary (under root, nginx will try to listen on 80). Make sure
to detect if an https request was processed by http.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Wed, 09 Jul 2014 05:19:51 +0400 |
parents | e7dc8f4d0a4b |
children | b86c05516e65 |
rev | line source |
---|---|
248
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
1 #!/usr/bin/perl |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
2 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
3 # (C) Maxim Dounin |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
4 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
5 # Tests for http proxy websockets support. |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
6 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
7 ############################################################################### |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
8 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
9 use warnings; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
10 use strict; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
11 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
12 use Test::More; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
13 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
14 use IO::Poll; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
15 use IO::Select; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
16 use IO::Socket::INET; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
17 use Socket qw/ CRLF /; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
18 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
19 BEGIN { use FindBin; chdir($FindBin::Bin); } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
20 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
21 use lib 'lib'; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
22 use Test::Nginx; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
23 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
24 ############################################################################### |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
25 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
26 select STDERR; $| = 1; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
27 select STDOUT; $| = 1; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
28 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
29 eval { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
30 require Protocol::WebSocket::Handshake::Client; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
31 require Protocol::WebSocket::Handshake::Server; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
32 require Protocol::WebSocket::Frame; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
33 }; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
34 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
35 plan(skip_all => 'Protocol::WebSocket not installed') if $@; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
36 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
37 my $t = Test::Nginx->new()->has(qw/http proxy/) |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
38 ->write_file_expand('nginx.conf', <<'EOF')->plan(26); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
39 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
40 %%TEST_GLOBALS%% |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
41 |
249
6a0d934950bc
Tests: remove extra spaces in "daemon off".
Maxim Dounin <mdounin@mdounin.ru>
parents:
248
diff
changeset
|
42 daemon off; |
248
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
43 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
44 events { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
45 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
46 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
47 http { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
48 %%TEST_GLOBALS_HTTP%% |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
49 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
50 server { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
51 listen 127.0.0.1:8080; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
52 server_name localhost; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
53 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
54 location / { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
55 proxy_pass http://127.0.0.1:8081; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
56 proxy_http_version 1.1; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
57 proxy_set_header Upgrade $http_upgrade; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
58 proxy_set_header Connection "Upgrade"; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
59 proxy_read_timeout 2s; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
60 send_timeout 2s; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
61 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
62 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
63 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
64 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
65 EOF |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
66 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
67 $t->run_daemon(\&websocket_fake_daemon); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
68 $t->run(); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
69 |
274
ccebd3168b5b
Tests: fix startup race in proxy_websocket.t, proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
263
diff
changeset
|
70 $t->waitforsocket('127.0.0.1:8081') |
ccebd3168b5b
Tests: fix startup race in proxy_websocket.t, proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
263
diff
changeset
|
71 or die "Can't start test backend"; |
ccebd3168b5b
Tests: fix startup race in proxy_websocket.t, proxy_upgrade.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
263
diff
changeset
|
72 |
248
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
73 ############################################################################### |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
74 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
75 # establish websocket connection |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
76 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
77 my $s = websocket_connect(); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
78 ok($s, "websocket handshake"); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
79 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
80 SKIP: { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
81 skip "handshake failed", 22 unless $s; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
82 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
83 # send a frame |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
84 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
85 websocket_write($s, 'foo'); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
86 is(websocket_read($s), 'bar', "websocket response"); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
87 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
88 # send some big frame |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
89 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
90 websocket_write($s, 'foo' x 16384); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
91 like(websocket_read($s), qr/^(bar){16384}$/, "websocket big response"); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
92 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
93 # send multiple frames |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
94 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
95 for my $i (1 .. 10) { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
96 websocket_write($s, ('foo' x 16384) . $i); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
97 websocket_write($s, 'bazz' . $i); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
98 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
99 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
100 for my $i (1 .. 10) { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
101 like(websocket_read($s), qr/^(bar){16384}\d+$/, "websocket $i"); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
102 is(websocket_read($s), 'bazz' . $i, "websocket small $i"); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
103 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
104 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
105 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
106 # establish websocket connection with some pipelined data |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
107 # and make sure they are correctly passed upstream |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
108 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
109 undef $s; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
110 $s = websocket_connect("foo"); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
111 ok($s, "handshake pipelined"); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
112 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
113 SKIP: { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
114 skip "handshake failed", 2 unless $s; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
115 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
116 is(websocket_read($s), "bar", "response pipelined"); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
117 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
118 websocket_write($s, "foo"); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
119 is(websocket_read($s), "bar", "next to pipelined"); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
120 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
121 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
122 ############################################################################### |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
123 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
124 sub websocket_connect { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
125 my ($message) = @_; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
126 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
127 my $s = IO::Socket::INET->new( |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
128 Proto => 'tcp', |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
129 PeerAddr => '127.0.0.1:8080' |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
130 ) |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
131 or die "Can't connect to nginx: $!\n"; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
132 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
133 my $h = Protocol::WebSocket::Handshake::Client->new( |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
134 url => 'ws://localhost'); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
135 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
136 # send request, $h->to_string |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
137 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
138 my $buf = $h->to_string; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
139 $buf .= Protocol::WebSocket::Frame->new($message)->to_bytes |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
140 if $message; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
141 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
142 local $SIG{PIPE} = 'IGNORE'; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
143 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
144 log_out($buf); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
145 $s->syswrite($buf); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
146 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
147 # read response |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
148 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
149 my $got = ''; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
150 $buf = ''; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
151 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
152 $s->blocking(0); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
153 while (IO::Select->new($s)->can_read(1.5)) { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
154 my $n = $s->sysread($buf, 1024); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
155 last unless $n; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
156 log_in($buf); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
157 $got .= $buf; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
158 last if $got =~ /\x0d?\x0a\x0d?\x0a$/; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
159 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
160 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
161 # parse server response |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
162 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
163 $h->parse($got); |
278
b6f0537afa01
Tests: fix pipelining tests in proxy_websocket.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
164 |
b6f0537afa01
Tests: fix pipelining tests in proxy_websocket.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
165 # store the rest for later websocket_read() |
b6f0537afa01
Tests: fix pipelining tests in proxy_websocket.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
166 # see websocket_read() for details |
b6f0537afa01
Tests: fix pipelining tests in proxy_websocket.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
167 |
b6f0537afa01
Tests: fix pipelining tests in proxy_websocket.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
168 ${*$s}->{_websocket_frame} ||= Protocol::WebSocket::Frame->new(); |
b6f0537afa01
Tests: fix pipelining tests in proxy_websocket.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
169 ${*$s}->{_websocket_frame}->append($got); |
b6f0537afa01
Tests: fix pipelining tests in proxy_websocket.t.
Maxim Dounin <mdounin@mdounin.ru>
parents:
274
diff
changeset
|
170 |
248
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
171 return $s if $h->is_done; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
172 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
173 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
174 sub websocket_write { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
175 my ($s, $message) = @_; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
176 my $frame = Protocol::WebSocket::Frame->new($message); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
177 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
178 local $SIG{PIPE} = 'IGNORE'; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
179 $s->blocking(1); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
180 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
181 log_out($frame->to_bytes); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
182 $s->syswrite($frame->to_bytes); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
183 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
184 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
185 sub websocket_read { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
186 my ($s) = @_; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
187 my ($buf, $got); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
188 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
189 # store frame object in socket itself to simplify things |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
190 # this works as $s is IO::Handle, see man IO::Handle |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
191 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
192 ${*$s}->{_websocket_frame} ||= Protocol::WebSocket::Frame->new(); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
193 my $frame = ${*$s}->{_websocket_frame}; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
194 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
195 $s->blocking(0); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
196 $got = $frame->next(); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
197 return $got if defined $got; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
198 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
199 while (IO::Select->new($s)->can_read(1.5)) { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
200 my $n = $s->sysread($buf, 65536); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
201 return $got unless $n; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
202 log_in($buf); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
203 $frame->append($buf); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
204 $got = $frame->next(); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
205 return $got if defined $got; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
206 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
207 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
208 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
209 ############################################################################### |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
210 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
211 sub websocket_fake_daemon { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
212 my $server = IO::Socket::INET->new( |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
213 Proto => 'tcp', |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
214 LocalAddr => '127.0.0.1:8081', |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
215 Listen => 5, |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
216 Reuse => 1 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
217 ) |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
218 or die "Can't create listening socket: $!\n"; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
219 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
220 while (my $client = $server->accept()) { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
221 websocket_handle_client($client); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
222 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
223 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
224 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
225 sub websocket_handle_client { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
226 my ($client) = @_; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
227 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
228 $client->autoflush(1); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
229 $client->blocking(0); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
230 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
231 my $poll = IO::Poll->new; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
232 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
233 my $hs = Protocol::WebSocket::Handshake::Server->new; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
234 my $frame = Protocol::WebSocket::Frame->new; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
235 my $buffer = ''; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
236 my $closed; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
237 my $n; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
238 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
239 log2c("(new connection $client)"); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
240 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
241 while (1) { |
343
e7dc8f4d0a4b
Tests: whitespace and spelling fixes.
Sergey Kandaurov <pluknet@nginx.com>
parents:
317
diff
changeset
|
242 $poll->mask($client => ($buffer ? POLLIN|POLLOUT : POLLIN)); |
248
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
243 my $p = $poll->poll(0.5); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
244 log2c("(poll $p)"); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
245 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
246 foreach my $reader ($poll->handles(POLLIN)) { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
247 $n = $client->sysread(my $chunk, 65536); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
248 return unless $n; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
249 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
250 log2i($chunk); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
251 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
252 if (!$hs->is_done) { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
253 unless (defined $hs->parse($chunk)) { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
254 log2c("(error: " . $hs->error . ")"); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
255 return; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
256 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
257 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
258 if ($hs->is_done) { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
259 $buffer = $hs->to_string; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
260 log2o($buffer); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
261 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
262 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
263 log2c("(parse: $chunk)"); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
264 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
265 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
266 $frame->append($chunk); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
267 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
268 while (defined(my $message = $frame->next)) { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
269 my $f; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
270 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
271 if ($frame->is_close) { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
272 log2c("(close frame)"); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
273 $closed = 1; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
274 $f = $frame->new(type => 'close') |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
275 ->to_bytes; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
276 } else { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
277 $message =~ s/foo/bar/g; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
278 $f = $frame->new($message)->to_bytes; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
279 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
280 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
281 log2o($f); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
282 $buffer .= $f; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
283 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
284 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
285 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
286 foreach my $writer ($poll->handles(POLLOUT)) { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
287 next unless length $buffer; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
288 $n = $writer->syswrite($buffer); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
289 substr $buffer, 0, $n, ''; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
290 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
291 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
292 if ($closed && length $buffer == 0) { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
293 log2c("(closed)"); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
294 return; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
295 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
296 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
297 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
298 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
299 sub log2i { Test::Nginx::log_core('|| <<', @_); } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
300 sub log2o { Test::Nginx::log_core('|| >>', @_); } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
301 sub log2c { Test::Nginx::log_core('||', @_); } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
302 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
303 ############################################################################### |