Mercurial > hg > nginx-tests
annotate proxy_websocket.t @ 251:df984d23f9d1
Tests: improve fastcgi keepalive tests.
On some platforms fastcgi_keepalive.t tests failed due to problems in
handling of data split into multiple packets. Harden tests to fail
on all platforms by adding more sleeps, and mark them as TODO till
underlying problems are fixed.
Additionally, add some padding testing.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Fri, 25 Jan 2013 20:53:53 +0400 |
parents | 6a0d934950bc |
children | 71bb2a896c7a |
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 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
70 ############################################################################### |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
71 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
72 TODO: { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
73 local $TODO = 'not yet'; |
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 ############################################################################### |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
125 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
126 sub websocket_connect { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
127 my ($message) = @_; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
128 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
129 my $s = IO::Socket::INET->new( |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
130 Proto => 'tcp', |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
131 PeerAddr => '127.0.0.1:8080' |
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 or die "Can't connect to nginx: $!\n"; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
134 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
135 my $h = Protocol::WebSocket::Handshake::Client->new( |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
136 url => 'ws://localhost'); |
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 # send request, $h->to_string |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
139 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
140 my $buf = $h->to_string; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
141 $buf .= Protocol::WebSocket::Frame->new($message)->to_bytes |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
142 if $message; |
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 local $SIG{PIPE} = 'IGNORE'; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
145 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
146 log_out($buf); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
147 $s->syswrite($buf); |
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 # read response |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
150 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
151 my $got = ''; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
152 $buf = ''; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
153 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
154 $s->blocking(0); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
155 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
|
156 my $n = $s->sysread($buf, 1024); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
157 last unless $n; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
158 log_in($buf); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
159 $got .= $buf; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
160 last if $got =~ /\x0d?\x0a\x0d?\x0a$/; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
161 } |
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 # parse server response |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
164 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
165 $h->parse($got); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
166 return $s if $h->is_done; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
167 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
168 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
169 sub websocket_write { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
170 my ($s, $message) = @_; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
171 my $frame = Protocol::WebSocket::Frame->new($message); |
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 local $SIG{PIPE} = 'IGNORE'; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
174 $s->blocking(1); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
175 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
176 log_out($frame->to_bytes); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
177 $s->syswrite($frame->to_bytes); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
178 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
179 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
180 sub websocket_read { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
181 my ($s) = @_; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
182 my ($buf, $got); |
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 # 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
|
185 # 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
|
186 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
187 ${*$s}->{_websocket_frame} ||= Protocol::WebSocket::Frame->new(); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
188 my $frame = ${*$s}->{_websocket_frame}; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
189 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
190 $s->blocking(0); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
191 $got = $frame->next(); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
192 return $got if defined $got; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
193 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
194 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
|
195 my $n = $s->sysread($buf, 65536); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
196 return $got unless $n; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
197 log_in($buf); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
198 $frame->append($buf); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
199 $got = $frame->next(); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
200 return $got if defined $got; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
201 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
202 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
203 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
204 ############################################################################### |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
205 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
206 sub websocket_fake_daemon { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
207 my $server = IO::Socket::INET->new( |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
208 Proto => 'tcp', |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
209 LocalAddr => '127.0.0.1:8081', |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
210 Listen => 5, |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
211 Reuse => 1 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
212 ) |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
213 or die "Can't create listening socket: $!\n"; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
214 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
215 while (my $client = $server->accept()) { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
216 websocket_handle_client($client); |
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 } |
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 sub websocket_handle_client { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
221 my ($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 $client->autoflush(1); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
224 $client->blocking(0); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
225 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
226 my $poll = IO::Poll->new; |
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 my $hs = Protocol::WebSocket::Handshake::Server->new; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
229 my $frame = Protocol::WebSocket::Frame->new; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
230 my $buffer = ''; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
231 my $closed; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
232 my $n; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
233 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
234 log2c("(new connection $client)"); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
235 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
236 while (1) { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
237 $poll->mask($client => ($buffer ? POLLIN|POLLOUT : POLLIN)); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
238 my $p = $poll->poll(0.5); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
239 log2c("(poll $p)"); |
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 foreach my $reader ($poll->handles(POLLIN)) { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
242 $n = $client->sysread(my $chunk, 65536); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
243 return unless $n; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
244 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
245 log2i($chunk); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
246 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
247 if (!$hs->is_done) { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
248 unless (defined $hs->parse($chunk)) { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
249 log2c("(error: " . $hs->error . ")"); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
250 return; |
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 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
253 if ($hs->is_done) { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
254 $buffer = $hs->to_string; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
255 log2o($buffer); |
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 log2c("(parse: $chunk)"); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
259 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
260 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
261 $frame->append($chunk); |
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 while (defined(my $message = $frame->next)) { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
264 my $f; |
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 if ($frame->is_close) { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
267 log2c("(close frame)"); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
268 $closed = 1; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
269 $f = $frame->new(type => 'close') |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
270 ->to_bytes; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
271 } else { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
272 $message =~ s/foo/bar/g; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
273 $f = $frame->new($message)->to_bytes; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
274 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
275 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
276 log2o($f); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
277 $buffer .= $f; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
278 } |
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 foreach my $writer ($poll->handles(POLLOUT)) { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
282 next unless length $buffer; |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
283 $n = $writer->syswrite($buffer); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
284 substr $buffer, 0, $n, ''; |
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 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
287 if ($closed && length $buffer == 0) { |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
288 log2c("(closed)"); |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
289 return; |
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 } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
293 |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
294 sub log2i { Test::Nginx::log_core('|| <<', @_); } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
295 sub log2o { Test::Nginx::log_core('|| >>', @_); } |
c388d7c3a666
Tests: tests for upcoming websocket proxy support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
296 sub log2c { Test::Nginx::log_core('||', @_); } |
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 ############################################################################### |