Skip to content

Commit 3ccf2e4

Browse files
committed
refactor server_addr
1 parent e3e4328 commit 3ccf2e4

File tree

5 files changed

+229
-112
lines changed

5 files changed

+229
-112
lines changed

examples/http/server.php

Lines changed: 103 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -1,183 +1,196 @@
11
<?php
2+
/**
3+
* This file is part of Swoole.
4+
*
5+
* @link https://www.swoole.com
6+
* @contact team@swoole.com
7+
* @license https://github.com/swoole/library/blob/master/LICENSE
8+
*/
9+
10+
declare(strict_types=1);
211
function dump($var)
312
{
4-
return highlight_string("<?php\n\$array = " . var_export($var, true) . ";", true);
13+
return highlight_string("<?php\n\$array = " . var_export($var, true) . ';', true);
514
}
615

716
$key_dir = dirname(dirname(__DIR__)) . '/tests/ssl';
8-
$http = new Swoole\Http\Server("0.0.0.0", 9501, SWOOLE_BASE);
17+
$http = new Swoole\Http\Server('0.0.0.0', 9501, SWOOLE_PROCESS);
918
//$http = new Swoole\Http\Server("::", 9501, SWOOLE_BASE, SWOOLE_SOCK_TCP6);
1019
//$http = new Swoole\Http\Server("0.0.0.0", 9501);
1120
//$http = new Swoole\Http\Server("0.0.0.0", 9501, SWOOLE_BASE, SWOOLE_SOCK_TCP | SWOOLE_SSL);
1221
//https
1322
//$http = new Swoole\Http\Server("0.0.0.0", 9501, SWOOLE_BASE, SWOOLE_SOCK_TCP | SWOOLE_SSL);
1423
//$http->setGlobal(HTTP_GLOBAL_ALL, HTTP_GLOBAL_GET|HTTP_GLOBAL_POST|HTTP_GLOBAL_COOKIE);
1524
$http->set([
16-
// 'daemonize' => 1,
17-
// 'open_cpu_affinity' => 1,
18-
// 'task_worker_num' => 1,
25+
// 'daemonize' => 1,
26+
// 'open_cpu_affinity' => 1,
27+
// 'task_worker_num' => 1,
1928
//'open_cpu_affinity' => 1,
2029
//'task_worker_num' => 100,
2130
//'enable_port_reuse' => true,
2231
// 'http_compression' => false,
23-
'worker_num' => 1,
32+
'worker_num' => 1,
2433
'upload_max_filesize' => 1 * 1024 * 1024 * 1024,
25-
'package_max_length' => 1 * 1024 * 1024,
34+
'package_max_length' => 1 * 1024 * 1024,
2635
//'log_file' => __DIR__.'/swoole.log',
27-
// 'reactor_num' => 24,
36+
// 'reactor_num' => 24,
2837
//'dispatch_mode' => 3,
2938
//'discard_timeout_request' => true,
30-
// 'open_tcp_nodelay' => true,
31-
// 'open_mqtt_protocol' => true,
39+
// 'open_tcp_nodelay' => true,
40+
// 'open_mqtt_protocol' => true,
3241
//'task_worker_num' => 1,
3342
//'user' => 'www-data',
3443
//'group' => 'www-data',
35-
//'daemonize' => true,
36-
// 'ssl_cert_file' => $key_dir.'/ssl.crt',
37-
// 'ssl_key_file' => $key_dir.'/ssl.key',
38-
// 'enable_static_handler' => true,
39-
// 'document_root' => '/home/htf/workspace/php/www.swoole.com/web/'
44+
//'daemonize' => true,
45+
// 'ssl_cert_file' => $key_dir.'/ssl.crt',
46+
// 'ssl_key_file' => $key_dir.'/ssl.key',
47+
// 'enable_static_handler' => true,
48+
// 'document_root' => '/home/htf/workspace/php/www.swoole.com/web/'
4049
]);
4150

4251
$http->listen('127.0.0.1', 9502, SWOOLE_SOCK_TCP);
4352

4453
function chunk(Swoole\Http\Request $request, Swoole\Http\Response $response)
4554
{
46-
$response->write("<h1>hello world1</h1>");
55+
$response->write('<h1>hello world1</h1>');
4756
//sleep(1);
48-
$response->write("<h1>hello world2</h1>");
57+
$response->write('<h1>hello world2</h1>');
4958
//sleep(1);
5059
$response->end();
5160
}
5261

5362
function no_chunk(Swoole\Http\Request $request, Swoole\Http\Response $response)
5463
{
55-
/**
64+
/*
5665
* Cookie Test
5766
*/
5867
//$response->cookie('test1', '1234', time() + 86400, '/');
59-
// $response->cookie('test2', '5678', time() + 86400);
60-
// var_dump($response->cookie);
61-
// var_dump($request->cookie);
62-
// try
63-
// {
64-
// if (rand(1, 99) % 2 == 1)
65-
// {
66-
// throw new Exception("just for fun.");
67-
// }
68-
// $response->end("<h1>Hello Swoole. #".rand(1000, 9999)."</h1>");
69-
// }
70-
// catch(Exception $e)
71-
// {
72-
// $response->end("<h1>Exceptiom</h1><div>".$e->getMessage()."</div>");
73-
// }
68+
// $response->cookie('test2', '5678', time() + 86400);
69+
// var_dump($response->cookie);
70+
// var_dump($request->cookie);
71+
// try
72+
// {
73+
// if (rand(1, 99) % 2 == 1)
74+
// {
75+
// throw new Exception("just for fun.");
76+
// }
77+
// $response->end("<h1>Hello Swoole. #".rand(1000, 9999)."</h1>");
78+
// }
79+
// catch(Exception $e)
80+
// {
81+
// $response->end("<h1>Exceptiom</h1><div>".$e->getMessage()."</div>");
82+
// }
7483
//var_dump($request->server['request_uri'], substr($request->server['request_uri'], -4, 4));
7584

7685
if (substr($request->server['request_uri'], -8, 8) == 'test.jpg') {
7786
$response->header('Content-Type', 'image/jpeg');
7887
$response->sendfile(dirname(__DIR__) . '/test.jpg');
7988
return;
80-
} elseif ($request->server['request_uri'] == '/test.txt') {
89+
}
90+
if ($request->server['request_uri'] == '/test.txt') {
8191
$last_modified_time = filemtime(__DIR__ . '/test.txt');
82-
$etag = md5_file(__DIR__ . '/test.txt');
92+
$etag = md5_file(__DIR__ . '/test.txt');
8393
// always send headers
84-
$response->header("Last-Modified", gmdate("D, d M Y H:i:s", $last_modified_time) . " GMT");
85-
$response->header("Etag", $etag);
94+
$response->header('Last-Modified', gmdate('D, d M Y H:i:s', $last_modified_time) . ' GMT');
95+
$response->header('Etag', $etag);
8696
if (strtotime($request->header['if-modified-since']) == $last_modified_time or trim($request->header['if-none-match']) == $etag) {
8797
$response->status(304);
8898
$response->end();
8999
} else {
90100
$response->sendfile(__DIR__ . '/test.txt');
91101
}
92102
return;
93-
} else if ($request->server['request_uri'] == '/favicon.ico') {
103+
}
104+
if ($request->server['request_uri'] == '/favicon.ico') {
94105
$response->status(404);
95106
$response->end();
96107
return;
97-
} else if ($request->server['request_uri'] == '/big_response') {
108+
}
109+
if ($request->server['request_uri'] == '/big_response') {
98110
var_dump($response->end(str_repeat('A', 16 * 1024 * 1024)));
99111
return;
100-
} else if ($request->server['request_uri'] == '/code') {
112+
}
113+
if ($request->server['request_uri'] == '/code') {
101114
$response->sendfile(__FILE__);
102115
return;
103-
} elseif ($request->server['request_uri'] == '/save') {
116+
}
117+
if ($request->server['request_uri'] == '/save') {
104118
file_put_contents(__DIR__ . '/httpdata', $request->getData());
105119
$response->end('hello');
106120
return;
107-
} else {
108-
//var_dump($request->post);
109-
//var_export($request->cookie);
110-
// var_dump($request->rawContent());
111-
// if ($request->server['request_method'] == 'POST')
112-
// {
113-
// var_dump($request->post);
114-
// }
115-
// echo "GET:" . var_export($_GET, true)."\n";
116-
// echo "POST:" . var_export($_POST, true)."\n";
117-
// echo "get:" . var_export($request->get, true)."\n";
118-
// echo "post:" . var_export($request->post, true)."\n";
119-
//var_dump($request->server);
120-
$output = '';
121-
$output .= "<h2>HEADER:</h2>" . dump($request->header);
122-
$output .= "<h2>SERVER:</h2>" . dump($request->server);
123-
if (!empty($request->files)) {
124-
$files = $request->files;
125-
foreach ($files as &$f) {
126-
$f['md5'] = md5_file($f['tmp_name']);
127-
}
128-
$output .= "<h2>FILE:</h2>" . dump($files);
129-
}
130-
if (!empty($request->cookie)) {
131-
$output .= "<h2>COOKIES:</h2>" . dump($request->cookie);
132-
}
133-
if (!empty($request->get)) {
134-
$output .= "<h2>GET:</h2>" . dump($request->get);
135-
}
136-
if (!empty($request->post)) {
137-
$output .= "<h2>POST:</h2>" . dump($request->post);
121+
}
122+
//var_dump($request->post);
123+
//var_export($request->cookie);
124+
// var_dump($request->rawContent());
125+
// if ($request->server['request_method'] == 'POST')
126+
// {
127+
// var_dump($request->post);
128+
// }
129+
// echo "GET:" . var_export($_GET, true)."\n";
130+
// echo "POST:" . var_export($_POST, true)."\n";
131+
// echo "get:" . var_export($request->get, true)."\n";
132+
// echo "post:" . var_export($request->post, true)."\n";
133+
//var_dump($request->server);
134+
$output = '';
135+
$output .= '<h2>HEADER:</h2>' . dump($request->header);
136+
$output .= '<h2>SERVER:</h2>' . dump($request->server);
137+
if (!empty($request->files)) {
138+
$files = $request->files;
139+
foreach ($files as &$f) {
140+
$f['md5'] = md5_file($f['tmp_name']);
138141
}
139-
var_dump($request->post);
140-
//$response->header('X-Server', 'Swoole');
141-
//unset($request, $response);
142-
// Swoole\Timer::after(2000, function() use ( $response) {
143-
$response->end("<h1>Hello Swoole.</h1>" . $output);
144-
return;
145-
// });
142+
$output .= '<h2>FILE:</h2>' . dump($files);
143+
}
144+
if (!empty($request->cookie)) {
145+
$output .= '<h2>COOKIES:</h2>' . dump($request->cookie);
146146
}
147+
if (!empty($request->get)) {
148+
$output .= '<h2>GET:</h2>' . dump($request->get);
149+
}
150+
if (!empty($request->post)) {
151+
$output .= '<h2>POST:</h2>' . dump($request->post);
152+
}
153+
//$response->header('X-Server', 'Swoole');
154+
//unset($request, $response);
155+
// Swoole\Timer::after(2000, function() use ( $response) {
156+
$response->end('<h1>Hello Swoole.</h1>' . $output);
157+
return;
158+
// });
159+
147160
//var_dump($request);
148-
// var_dump($_GET);
161+
// var_dump($_GET);
149162
//var_dump($_POST);
150163
//var_dump($_COOKIE);
151164
//$response->status(301);
152165
//$response->header("Location", "http://www.baidu.com/");
153166
//$response->cookie("hello", "world", time() + 3600);
154-
// $response->header("Content-Type", "text/html; charset=utf-8");
167+
// $response->header("Content-Type", "text/html; charset=utf-8");
155168

156169
//var_dump($request->post);
157-
// var_dump($request->get);
170+
// var_dump($request->get);
158171

159-
// echo strlen(gzdeflate("<h1>Hello Swoole.</h1>"));
160-
// $response->end("<h1>Hello Swoole.</h1>");
172+
// echo strlen(gzdeflate("<h1>Hello Swoole.</h1>"));
173+
// $response->end("<h1>Hello Swoole.</h1>");
161174
//$response->end("<h1>Hello Swoole. #".str_repeat('A', rand(100, 999))."</h1>");
162175
//global $http;
163176
//$http->task("hello world");
164177
$file = realpath(__DIR__ . '/../' . $request->server['request_uri']);
165178
if (is_file($file)) {
166-
echo "http get file=$file\n";
179+
echo "http get file={$file}\n";
167180
if (substr($file, -4) == '.php') {
168181
$response->gzip();
169182
} else {
170183
$response->header('Content-Type', 'image/jpeg');
171184
}
172185
$content = file_get_contents($file);
173-
echo "response size = " . strlen($content) . "\n";
186+
echo 'response size = ' . strlen($content) . "\n";
174187

175-
// $response->write($content);
176-
// $response->end();
188+
// $response->write($content);
189+
// $response->end();
177190

178191
$response->end($content);
179192
} else {
180-
$response->end("<h1>Hello Swoole.</h1>");
193+
$response->end('<h1>Hello Swoole.</h1>');
181194
}
182195
}
183196

@@ -194,7 +207,7 @@ function no_chunk(Swoole\Http\Request $request, Swoole\Http\Response $response)
194207
});
195208

196209
$http->on('finish', function () {
197-
echo "task finish";
210+
echo 'task finish';
198211
});
199212

200213
$http->on('task', function () {
@@ -205,7 +218,6 @@ function no_chunk(Swoole\Http\Request $request, Swoole\Http\Response $response)
205218
// echo "on close\n";
206219
//});
207220

208-
209221
$http->on('workerStart', function ($serv, $id) {
210222
//var_dump($serv);
211223
});

ext-src/swoole_http_server.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,10 @@ int php_swoole_http_server_onReceive(Server *serv, RecvData *req) {
136136
http_server_session_track_ip(ht, conn, session_id, SW_ZSTR_KNOWN(SW_ZEND_STR_SERVER_ADDR), server_ips);
137137
http_server_session_track_ip(ht, conn, session_id, SW_ZSTR_KNOWN(SW_ZEND_STR_REMOTE_ADDR), client_ips);
138138
} else {
139-
http_server_add_server_array(ht, SW_ZSTR_KNOWN(SW_ZEND_STR_SERVER_ADDR), conn->socket->get_addr());
140-
http_server_add_server_array(ht, SW_ZSTR_KNOWN(SW_ZEND_STR_REMOTE_ADDR), conn->info.get_addr());
139+
http_server_add_server_array(
140+
ht, SW_ZSTR_KNOWN(SW_ZEND_STR_SERVER_ADDR), serv->get_client_local_addr(conn));
141+
http_server_add_server_array(
142+
ht, SW_ZSTR_KNOWN(SW_ZEND_STR_REMOTE_ADDR), serv->get_client_remote_addr(conn));
141143
}
142144
}
143145

include/swoole_server.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,15 @@ struct Connection {
104104
uint16_t waiting_time;
105105
TimerNode *timer;
106106
/**
107-
* socket address
107+
* Remote IP address and port
108108
*/
109109
network::Address info;
110+
/**
111+
* Local IP address and port
112+
* The `local_addr` only stores the index, need to query addr map to convert to real addr
113+
*/
114+
uint16_t local_addr;
115+
uint16_t local_port;
110116
/**
111117
* link anything, for kernel, do not use with application.
112118
*/
@@ -1047,6 +1053,8 @@ class Server {
10471053
std::unordered_map<std::string, Command> commands;
10481054
std::unordered_map<int, Command::Handler> command_handlers;
10491055
std::unordered_map<int64_t, Command::Callback> command_callbacks;
1056+
std::unordered_map<uint16_t, network::Address> local_addr_v4_map;
1057+
std::unordered_map<uint16_t, network::Address> local_addr_v6_map;
10501058
int command_current_id = 1;
10511059
int64_t command_current_request_id = 1;
10521060

@@ -1162,6 +1170,10 @@ class Server {
11621170
void add_hook(enum HookType type, const Callback &func, int push_back);
11631171
bool add_command(const std::string &command, int accepted_process_types, const Command::Handler &func);
11641172
Connection *add_connection(const ListenPort *ls, network::Socket *_socket, int server_fd);
1173+
uint16_t get_local_addr_index(network::Address *addr);
1174+
bool init_local_addr_map();
1175+
const char *get_client_local_addr(Connection *conn);
1176+
const char *get_client_remote_addr(Connection *conn);
11651177
void abort_connection(Reactor *reactor, const ListenPort *ls, network::Socket *_socket) const;
11661178
void abort_worker(Worker *worker) const;
11671179
void reset_worker_counter(Worker *worker) const;

include/swoole_socket.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,14 @@ struct Address {
125125
bool is_loopback_addr() const;
126126
bool empty() const;
127127

128+
in_addr *addr_v4() {
129+
return &addr.inet_v4.sin_addr;
130+
}
131+
132+
in6_addr *addr_v6() {
133+
return &addr.inet_v6.sin6_addr;
134+
}
135+
128136
/**
129137
* Get the string representation of the address
130138
*/

0 commit comments

Comments
 (0)