📝 update test/httptest.nas
This commit is contained in:
parent
9114ecd820
commit
4c0ef0fb99
|
@ -0,0 +1,64 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<head>
|
||||||
|
<title> nasal-http-test-web </title>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta author="ValKmjolnir">
|
||||||
|
<style>
|
||||||
|
body{
|
||||||
|
background: white
|
||||||
|
}
|
||||||
|
pre{
|
||||||
|
background: #303030;
|
||||||
|
font-family: 'Courier New', Courier, monospace;
|
||||||
|
font-size: small;
|
||||||
|
color: #d4d4d4;
|
||||||
|
}
|
||||||
|
code{
|
||||||
|
color: white;
|
||||||
|
font-family: 'Courier New', Courier, monospace;
|
||||||
|
font-size: small;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
code.key{color: #fc9999;}
|
||||||
|
code.id{color: #8abef0;}
|
||||||
|
code.opr{color: #f895e7;}
|
||||||
|
code.brace{color: #eafd70;}
|
||||||
|
code.str{color: #7cebb2;}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<img src="/pic/nasal.png" width="100" height="40"><br /></img>
|
||||||
|
<img src="https://img.shields.io/github/languages/code-size/ValKmjolnir/Nasal-Interpreter?style=flat-square&logo=github"></img>
|
||||||
|
<img src="https://img.shields.io/github/v/release/ValKmjolnir/Nasal-Interpreter?style=flat-square&logo=github"></img>
|
||||||
|
<img src="https://img.shields.io/badge/dev-v10.0-blue?style=flat-square&logo=github"></img>
|
||||||
|
<img src="https://img.shields.io/badge/license-MIT-green?style=flat-square&logo=github"><br/></img>
|
||||||
|
<text>
|
||||||
|
Hello, this is a simple HTML document just for test. This simple http server is written in nasal.<br />
|
||||||
|
Nasal is an ECMAscript-like programming language that used in Flightgear designed by Andy Ross.<br />
|
||||||
|
这是个用于测试的简易HTML文档。该http服务器是用nasal编写的。<br />
|
||||||
|
Nasal是类似ECMAscript的一款编程语言,用于飞行模拟器Flightgear。该语言由Andy Ross设计完成。<br /><br />
|
||||||
|
The interpreter is totally rewritten by ValKmjolnir using C++(-std=c++11) without reusing the code in Andy Ross's nasal interpreter.<br />
|
||||||
|
But we really appreciate that Andy created this amazing programming language and his interpreter project.<br /><br />
|
||||||
|
Now this project uses MIT license(2021/5/4). Edit it if you want, use this project to learn or create more interesting things(But don't forget me XD).<br/>
|
||||||
|
</text>
|
||||||
|
<img src="/pic/benchmark.png" width="500" height="400"></img>
|
||||||
|
<img src="/pic/mandelbrot.png" width="500" height="400"><br /></img>
|
||||||
|
<text>
|
||||||
|
Here is the benchmark of different versions of nasal interpreter(left).<br />
|
||||||
|
Look at this beautiful picture(right).<br />
|
||||||
|
Nasal can run this test file(test/bfcolored.nas) in about 220 seconds.<br />
|
||||||
|
In fact this test file cost over 2200 seconds before ver 8.0 .<br />
|
||||||
|
</text>
|
||||||
|
<pre>
|
||||||
|
1 <code class="key">var</code> <code class="id">nasal</code><code class="opr">=</code><code class="key">func</code><code class="brace">(</code><code class="id">lexical</code><code class="opr">,</code><code class="id">syntax</code><code class="brace">)</code><code class="brace">{</code>
|
||||||
|
2 <code> </code><code class="key">return</code> <code class="brace">{</code>
|
||||||
|
3 <code> </code><code class="id">print </code><code class="opr">:</code> <code class="key">func</code><code class="brace">{</code><code class="id">println</code><code class="brace">(</code><code class="str">"hello world"</code><code class="brace">)</code><code class="brace">}</code><code class="opr">,</code>
|
||||||
|
4 <code> </code><code class="id">set_lex</code><code class="opr">:</code> <code class="key">func</code><code class="brace">(</code><code class="id">lex</code><code class="brace">)</code><code class="brace">{</code><code class="id">lexical</code><code class="opr">=</code><code class="id">lex</code><code class="brace">}</code>,</code>
|
||||||
|
5 <code> </code><code class="id">get_lex</code><code class="opr">:</code> <code class="key">func</code><code class="brace">{</code><code class="key">return</code> <code class="id">lexical</code><code class="brace">}</code><code class="opr">,</code>
|
||||||
|
6 <code> </code><code class="id">set_syn</code><code class="opr">:</code> <code class="key">func</code><code class="brace">(</code><code class="id">syn</code><code class="brace">)</code><code class="brace">{</code><code class="id">syntax</code><code class="opr">=</code><code class="id">syn</code><code class="brace">}</code><code class="opr">,</code>
|
||||||
|
7 <code> </code><code class="id">get_syn</code><code class="opr">:</code> <code class="key">func</code><code class="brace">{</code><code class="key">return</code> <code class="id">syntax</code><code class="brace">}</code>
|
||||||
|
8 <code> </code><code class="brace">}</code><code class="opr">;</code>
|
||||||
|
9 <code class="brace">}</code>
|
||||||
|
</pre>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -3,41 +3,58 @@ import("module/libsock.nas");
|
||||||
var sd=socket.socket(socket.AF_INET,socket.SOCK_STREAM,socket.IPPROTO_IP);
|
var sd=socket.socket(socket.AF_INET,socket.SOCK_STREAM,socket.IPPROTO_IP);
|
||||||
socket.bind(sd,"127.0.0.1",8080);
|
socket.bind(sd,"127.0.0.1",8080);
|
||||||
socket.listen(sd,1);
|
socket.listen(sd,1);
|
||||||
var httpheader="Http/1.1 200 OK\n\n";
|
|
||||||
var httptail="\n";
|
# var filter={
|
||||||
var index="<html>
|
# " ":" ",
|
||||||
|
# "&":"&",
|
||||||
|
# "<":"<",
|
||||||
|
# ">":">",
|
||||||
|
# "\"":""",
|
||||||
|
# "'":"&qpos;"
|
||||||
|
# };
|
||||||
|
# var html_read_file=func(filename){
|
||||||
|
# var fd=io.open(filename,"rb");
|
||||||
|
# var content="";
|
||||||
|
# while(1){
|
||||||
|
# var s=mut(" ");
|
||||||
|
# if(io.read(fd,s,1)==0)
|
||||||
|
# break;
|
||||||
|
# if(contains(filter,chr(s[0])))
|
||||||
|
# content~=filter[chr(s[0])];
|
||||||
|
# else
|
||||||
|
# content~=s;
|
||||||
|
# }
|
||||||
|
# io.close(fd);
|
||||||
|
# return content;
|
||||||
|
# }
|
||||||
|
|
||||||
|
var respond={
|
||||||
|
ok:func(html){
|
||||||
|
return "Http/1.1 200 OK\n\n"~html~"\n";
|
||||||
|
},
|
||||||
|
not_found:"Http/1.1 404 NOT FOUND\n\n<!DOCTYPE html>
|
||||||
<head>
|
<head>
|
||||||
<title> nasal-http-test-web </title>
|
<title> 404 not found </title>
|
||||||
</head>
|
<meta charset=\"utf-8\">
|
||||||
<body>
|
|
||||||
<img src=\"/nasal.png\" width=\"100\" height=\"40\"><br /></img>
|
|
||||||
<text>
|
|
||||||
Hello, this is a simple HTML document just for test. This simple http server is written in nasal.<br />
|
|
||||||
Nasal is an ECMAscript-like programming language that used in Flightgear designed by Andy Ross.<br /><br />
|
|
||||||
The interpreter is totally rewritten by ValKmjolnir using C++(-std=c++11) without reusing the code in Andy Ross's nasal interpreter.<br />
|
|
||||||
But we really appreciate that Andy created this amazing programming language and his interpreter project.<br /><br />
|
|
||||||
Now this project uses MIT license(2021/5/4). Edit it if you want, use this project to learn or create more interesting things(But don't forget me XD).<br/>
|
|
||||||
</text>
|
|
||||||
<img src=\"/benchmark.png\" width=\"400\" height=\"300\"></img>
|
|
||||||
<img src=\"/mandelbrot.png\" width=\"400\" height=\"300\"><br /></img>
|
|
||||||
<text>
|
|
||||||
Here is the benchmark of different versions of nasal interpreter(left).<br />
|
|
||||||
Look at this beautiful picture(right).<br />
|
|
||||||
Nasal can run this test file(test/bfcolored.nas) in about 220 seconds.<br />
|
|
||||||
In fact this test file cost over 2200 seconds before ver 8.0 .<br />
|
|
||||||
</text>
|
|
||||||
</body>
|
|
||||||
</html>";
|
|
||||||
var notfound="<html>
|
|
||||||
<head>
|
|
||||||
<title> nasal-http-test-web </title>
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<text>
|
<text>
|
||||||
404 NOT FOUND!
|
404 NOT FOUND!
|
||||||
</text>
|
</text>
|
||||||
</body>
|
</body>
|
||||||
</html>";
|
</html>\n",
|
||||||
|
teapot:"Http/1.1 418 I'm a teapot\n\n<!DOCTYPE html>
|
||||||
|
<head>
|
||||||
|
<title> I'm a teapot </title>
|
||||||
|
<meta charset=\"utf-8\">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<text>
|
||||||
|
This server cannot brew coffee because it is a teapot.
|
||||||
|
</text>
|
||||||
|
</body>
|
||||||
|
</html>\n"
|
||||||
|
};
|
||||||
|
|
||||||
var files=func(){
|
var files=func(){
|
||||||
var res={};
|
var res={};
|
||||||
|
@ -57,22 +74,24 @@ while(1){
|
||||||
var first=split("\n",recieve_data.str)[0];
|
var first=split("\n",recieve_data.str)[0];
|
||||||
var (type,path)=split(" ",first)[0,1];
|
var (type,path)=split(" ",first)[0,1];
|
||||||
println("[",os.time(),"] ",client.ip," request ",type," [",path,"]");
|
println("[",os.time(),"] ",client.ip," request ",type," [",path,"]");
|
||||||
if(path=="/")
|
if(path=="/" or path=="/index")
|
||||||
socket.send(client.sd,httpheader~index~httptail);
|
socket.send(client.sd,respond.ok(io.fin("./doc/nasal-http-test-web.html")));
|
||||||
elsif(path=="/favicon.ico")
|
elsif(path=="/favicon.ico")
|
||||||
socket.send(client.sd,httpheader~io.fin("./pic/favicon.ico")~httptail);
|
socket.send(client.sd,respond.ok(io.fin("./pic/favicon.ico")));
|
||||||
elsif(path=="/nasal.png")
|
elsif(path=="/pic/nasal.png" or path=="/pic/benchmark.png" or path=="/pic/mandelbrot.png")
|
||||||
socket.send(client.sd,httpheader~io.fin("./pic/nasal.png")~httptail);
|
socket.send(client.sd,respond.ok(io.fin("."~path)));
|
||||||
elsif(path=="/benchmark.png")
|
|
||||||
socket.send(client.sd,httpheader~io.fin("./pic/benchmark.png")~httptail);
|
|
||||||
elsif(path=="/mandelbrot.png")
|
|
||||||
socket.send(client.sd,httpheader~io.fin("./pic/mandelbrot.png")~httptail);
|
|
||||||
else{
|
else{
|
||||||
var filename=substr(path,1,size(path)-1);
|
var filename=substr(path,1,size(path)-1);
|
||||||
if(contains(files,filename))
|
if(contains(files,filename)){
|
||||||
socket.send(client.sd,httpheader~io.fin("./test/"~filename)~httptail)
|
# var page="<head><title> "~filename~" </title><meta charset=\"utf-8\"></head>\n<body><pre>\n";
|
||||||
|
# var page_back="</pre>\n</body>\n";
|
||||||
|
# socket.send(client.sd,respond.ok(page~io.fin("./test/"~filename)~page_back));
|
||||||
|
socket.send(client.sd,respond.ok(io.fin("./test/"~filename)));
|
||||||
|
}
|
||||||
|
elsif(filename=="teapot")
|
||||||
|
socket.send(client.sd,respond.teapot);
|
||||||
else
|
else
|
||||||
socket.send(client.sd,httpheader~notfound~httptail);
|
socket.send(client.sd,respond.not_found);
|
||||||
}
|
}
|
||||||
socket.closesocket(client.sd);
|
socket.closesocket(client.sd);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue