🚀 update test/httptest.nas and doc/.html
This commit is contained in:
parent
4c0ef0fb99
commit
a4a7f5075a
|
@ -5,7 +5,8 @@
|
|||
<meta author="ValKmjolnir">
|
||||
<style>
|
||||
body{
|
||||
background: white
|
||||
background: white;
|
||||
width: 60%;
|
||||
}
|
||||
pre{
|
||||
background: #303030;
|
||||
|
@ -13,52 +14,149 @@
|
|||
font-size: small;
|
||||
color: #d4d4d4;
|
||||
}
|
||||
code{
|
||||
h1,h2,h3{
|
||||
padding: 5px;
|
||||
background-color: #555588;
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
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;}
|
||||
p{
|
||||
margin-left: 15px;
|
||||
}
|
||||
div.badges{
|
||||
text-align: center;
|
||||
}
|
||||
tr{
|
||||
vertical-align: top;
|
||||
}
|
||||
</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>
|
||||
<h1> Nasal | Not another scripting language!</h1>
|
||||
<div class="badges">
|
||||
<a href="https://github.com/ValKmjolnir/Nasal-Interpreter"><img src="https://img.shields.io/github/languages/code-size/ValKmjolnir/Nasal-Interpreter?style=flat-square&logo=github"></img></a>
|
||||
<a href="https://github.com/ValKmjolnir/Nasal-Interpreter"><img src="https://img.shields.io/github/v/release/ValKmjolnir/Nasal-Interpreter?style=flat-square&logo=github"></img></a>
|
||||
<a href="https://github.com/ValKmjolnir/Nasal-Interpreter"><img src="https://img.shields.io/badge/dev-v10.0-blue?style=flat-square&logo=github"></img></a>
|
||||
<a href="https://github.com/ValKmjolnir/Nasal-Interpreter"><img src="https://img.shields.io/badge/license-MIT-green?style=flat-square&logo=github"><br/></img></a>
|
||||
</div>
|
||||
<h2> Introduction | 介绍</h2>
|
||||
<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/>
|
||||
<p>
|
||||
Hello, this is a simple HTML document just for test. This simple http server is written in nasal.
|
||||
Nasal is an ECMAscript-like programming language that used in Flightgear designed by Andy Ross.<br/>
|
||||
</p>
|
||||
<p>
|
||||
这是个用于测试的简易HTML文档。该http服务器是用nasal编写的。Nasal是一款用于飞行模拟器Flightgear的、类似ECMAscript的编程语言。该语言由Andy Ross设计完成。
|
||||
</p>
|
||||
<p>
|
||||
The interpreter is totally rewritten by <a href="https://github.com/ValKmjolnir">ValKmjolnir</a> using C++(-std=c++11) without reusing the code in Andy Ross's nasal interpreter.
|
||||
But we really appreciate that Andy created this amazing programming language and his interpreter project.
|
||||
Now this project uses <a href="/license">MIT license</a> (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/>
|
||||
</p>
|
||||
<p>
|
||||
这个解释器是由<a href="https://github.com/ValKmjolnir">ValKmjolnir</a>用C++11编写的,完全没有复用Andy Ross版解释器的代码。但是我们仍然非常感谢Andy为我们带来了这么一款有趣的编程语言。
|
||||
现在这个项目使用<a href="/license">MIT协议</a>开源 (2021/5/4)。
|
||||
如果你有需求,可以自行修改,用这个解释器项目来学习或者创造更有意思的东西吧!(不过别忘了在项目协议中留下原作者名字哦)
|
||||
</p>
|
||||
</text>
|
||||
<img src="/pic/benchmark.png" width="500" height="400"></img>
|
||||
<img src="/pic/mandelbrot.png" width="500" height="400"><br /></img>
|
||||
<h2> Benchmark | 执行效率</h2>
|
||||
<img src="/pic/benchmark.png" width="450" height="350"></img>
|
||||
<img src="/pic/mandelbrot.png" width="450" height="350"><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 />
|
||||
<p>
|
||||
Benchmark of different versions of nasal interpreter(left).
|
||||
Beautiful picture generated by brainfuck interpreter written in nasal(right).
|
||||
</p>
|
||||
<p>
|
||||
不同版本的nasal解释器执行效率图(左)。
|
||||
nasal运行brainfuck绘制的曼德勃罗集合(右)。
|
||||
</p>
|
||||
<p>
|
||||
Nasal can run this test file(test/bfcolored.nas) to draw this picture in about 220 seconds.
|
||||
In fact this test file cost over 2200 seconds before ver 8.0 .
|
||||
</p>
|
||||
<p>
|
||||
Nasal现在可以在220秒内运行该文件(test/bfcolored.nas)并绘制出这张图。
|
||||
在8.0版本中这个解释器需要跑超过2200秒来绘制这张图。
|
||||
</p>
|
||||
</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>
|
||||
<h2> Example | 样例代码</h2>
|
||||
<form method="get">
|
||||
<text style="margin-left: 15px;"> </text>
|
||||
<input type="text" name="filename" value="ascii-art.nas">
|
||||
<input type="submit" value="search">
|
||||
</form>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<ul>
|
||||
<li><a href="/ascii-art.nas">ascii-art.nas</a></li>
|
||||
<li><a href="/auto_crash.nas">auto_crash.nas</a></li>
|
||||
<li><a href="/bf.nas">bf.nas</a></li>
|
||||
<li><a href="/bfcolored.nas">bfcolored.nas</a></li>
|
||||
<li><a href="/bfconvertor.nas">bfconvertor.nas</a></li>
|
||||
<li><a href="/bfs.nas">bfs.nas</a></li>
|
||||
<li><a href="/bigloop.nas">bigloop.nas</a></li>
|
||||
<li><a href="/bp.nas">bp.nas</a></li>
|
||||
<li><a href="/calc.nas">calc.nas</a></li>
|
||||
</ul>
|
||||
</td>
|
||||
<td>
|
||||
<ul>
|
||||
<li><a href="/choice.nas">choice.nas</a></li>
|
||||
<li><a href="/class.nas">class.nas</a></li>
|
||||
<li><a href="/coroutine.nas">coroutine.nas</a></li>
|
||||
<li><a href="/diff.nas">diff.nas</a></li>
|
||||
<li><a href="/exception.nas">exception.nas</a></li>
|
||||
<li><a href="/fib.nas">fib.nas</a></li>
|
||||
<li><a href="/filesystem.nas">filesystem.nas</a></li>
|
||||
<li><a href="/hexdump.nas">hexdump.nas</a></li>
|
||||
<li><a href="/httptest.nas">httptest.nas</a></li>
|
||||
</ul>
|
||||
</td>
|
||||
<td>
|
||||
<ul>
|
||||
<li><a href="/json.nas">json.nas</a></li>
|
||||
<li><a href="/leetcode1319.nas">leetcode1319.nas</a></li>
|
||||
<li><a href="/lexer.nas">lexer.nas</a></li>
|
||||
<li><a href="/life.nas">life.nas</a></li>
|
||||
<li><a href="/loop.nas">loop.nas</a></li>
|
||||
<li><a href="/mandel.nas">mandel.nas</a></li>
|
||||
<li><a href="/mandelbrot.nas">mandelbrot.nas</a></li>
|
||||
<li><a href="/md5.nas">md5.nas</a></li>
|
||||
<li><a href="/md5compare.nas">md5compare.nas</a></li>
|
||||
|
||||
</ul>
|
||||
</td>
|
||||
<td>
|
||||
<ul>
|
||||
<li><a href="/module_test.nas">module_test.nas</a></li>
|
||||
<li><a href="/nasal_test.nas">nasal_test.nas</a></li>
|
||||
<li><a href="/occupation.nas">occupation.nas</a></li>
|
||||
<li><a href="/pi.nas">pi.nas</a></li>
|
||||
<li><a href="/prime.nas">prime.nas</a></li>
|
||||
<li><a href="/qrcode.nas">qrcode.nas</a></li>
|
||||
<li><a href="/quick_sort.nas">quick_sort.nas</a></li>
|
||||
<li><a href="/scalar.nas">scalar.nas</a></li>
|
||||
<li><a href="/snake.nas">snake.nas</a></li>
|
||||
</ul>
|
||||
</td>
|
||||
<td>
|
||||
<ul>
|
||||
<li><a href="/tetris.nas">tetris.nas</a></li>
|
||||
<li><a href="/trait.nas">trait.nas</a></li>
|
||||
<li><a href="/turingmachine.nas">turingmachine.nas</a></li>
|
||||
<li><a href="/utf8chk.nas">utf8chk.nas</a></li>
|
||||
<li><a href="/wavecollapse.nas">wavecollapse.nas</a></li>
|
||||
<li><a href="/ycombinator.nas">ycombinator.nas</a></li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
<h2> Shutdown | 关闭服务器</h2>
|
||||
<text>
|
||||
<p>Click <a href="/shutdown">here</a> to shutdown http server.</p>
|
||||
<p>Don't click <a href="/teapot">me</a> besauce i am just a teapot.</p>
|
||||
</text>
|
||||
</html>
|
|
@ -1,32 +1,237 @@
|
|||
import("module/libsock.nas");
|
||||
|
||||
var sd=socket.socket(socket.AF_INET,socket.SOCK_STREAM,socket.IPPROTO_IP);
|
||||
socket.bind(sd,"127.0.0.1",8080);
|
||||
socket.listen(sd,1);
|
||||
var http=func(){
|
||||
var sd=nil;
|
||||
return {
|
||||
establish:func(ip,port){
|
||||
sd=socket.socket(socket.AF_INET,socket.SOCK_STREAM,socket.IPPROTO_IP);
|
||||
socket.bind(sd,ip,port);
|
||||
socket.listen(sd,1);
|
||||
println("[",os.time(),"] start server at [",ip,":",port,"]");
|
||||
},
|
||||
shutdown:func(){
|
||||
println("[",os.time(),"] shutdown server");
|
||||
socket.closesocket(sd);
|
||||
},
|
||||
accept:func(){
|
||||
return socket.accept(sd);
|
||||
},
|
||||
disconnect:func(client,log=0){
|
||||
if(log)
|
||||
println("[",os.time(),"] [",client.ip,"] disconnected");
|
||||
return socket.closesocket(client.sd);
|
||||
},
|
||||
recv:func(client){
|
||||
var data=socket.recv(client.sd,2048);
|
||||
if(!data.size){
|
||||
println("[",os.time(),"] [",client.ip,"] closed connection");
|
||||
return nil;
|
||||
}
|
||||
var first=split("\n",data.str)[0];
|
||||
var (type,path)=split(" ",first)[0,1];
|
||||
println("[",os.time(),"] [",client.ip,"] request ",type," [",path,"]");
|
||||
return {type:type,path:path};
|
||||
},
|
||||
send:func(client,content){
|
||||
println("[",os.time(),"] [",client.ip,"] get size ",size(content)," byte(s)");
|
||||
return socket.send(client.sd,content);
|
||||
}
|
||||
};
|
||||
}();
|
||||
http.establish("127.0.0.1",8080);
|
||||
|
||||
# var filter={
|
||||
# " ":" ",
|
||||
# "&":"&",
|
||||
# "<":"<",
|
||||
# ">":">",
|
||||
# "\"":""",
|
||||
# "'":"&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 highlight_style="
|
||||
<style>
|
||||
body{
|
||||
background: #303030;
|
||||
}
|
||||
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: #f895e7;}
|
||||
code.id{color: #8abef0;}
|
||||
code.opr{color: #f895e7;}
|
||||
code.brace{color: #eafd70;}
|
||||
code.str{color: #a5ffd0;}
|
||||
code.num{color: #ff9a41;}
|
||||
code.note{color: #808080;}
|
||||
</style>";
|
||||
|
||||
var html_read_file=func(filename){
|
||||
var timer=maketimestamp();
|
||||
timer.stamp();
|
||||
var keyword=["var","func","for","while","foreach","forindex","break","continue","return","if","else","elsif","nil"];
|
||||
var file_text=split("",io.fin(filename));
|
||||
var (s,index,len)=("",-1,size(file_text));
|
||||
var content="";
|
||||
|
||||
var next=func(){
|
||||
if(index+1>=len)
|
||||
return index+1;
|
||||
index+=1;
|
||||
s=file_text[index];
|
||||
return index;
|
||||
}
|
||||
var prev=func(){
|
||||
index-=1;
|
||||
s=file_text[index];
|
||||
}
|
||||
|
||||
while(1){
|
||||
if(next()>=len)
|
||||
break;
|
||||
if(s==">")
|
||||
content~="<code class=\"opr\">></code>";
|
||||
elsif(s=="<")
|
||||
content~="<code class=\"opr\"><</code>";
|
||||
elsif(s=="[" or s=="]" or s=="(" or s==")" or s=="{" or s=="}")
|
||||
content~="<code class=\"brace\">"~s~"</code>";
|
||||
elsif(s=="=" or s=="," or s==";" or s==":" or s=="|" or s=="&" or s=="!" or s=="?" or s=="+" or s=="-" or s=="*" or s=="/" or s=="~" or s==".")
|
||||
content~="<code class=\"opr\">"~s~"</code>";
|
||||
elsif(s=="_" or ("a"[0]<=s[0] and s[0]<="z"[0]) or ("A"[0]<=s[0] and s[0]<="Z"[0]) or s[0]<0 or s[0]>=128){
|
||||
var tmp=""~s; # generate a new string
|
||||
while(1){
|
||||
if(next()>=len)
|
||||
break;
|
||||
if(s=="_" or ("a"[0]<=s[0] and s[0]<="z"[0]) or ("A"[0]<=s[0] and s[0]<="Z"[0]) or ("0"[0]<=s[0] and s[0]<="9"[0]) or s[0]<0 or s[0]>=128)
|
||||
tmp~=s;
|
||||
else{
|
||||
prev();
|
||||
break;
|
||||
}
|
||||
}
|
||||
var is_key=0;
|
||||
foreach(var i;keyword)
|
||||
if(tmp==i){
|
||||
is_key=1;
|
||||
content~="<code class=\"key\">"~tmp~"</code>";
|
||||
break;
|
||||
}
|
||||
if(!is_key)
|
||||
content~="<code class=\"id\">"~tmp~"</code>";
|
||||
}elsif("0"[0]<=s[0] and s[0]<="9"[0]){
|
||||
content~="<code class=\"num\">"~s;
|
||||
if(next()>=len){
|
||||
content~="</code>";
|
||||
break;
|
||||
}
|
||||
if(s=="o"){
|
||||
content~="o";
|
||||
while(1){
|
||||
if(next()>=len)
|
||||
break;
|
||||
if("0"[0]<=s[0] and s[0]<="7"[0])
|
||||
content~=s;
|
||||
else
|
||||
break;
|
||||
}
|
||||
content~="</code>";
|
||||
prev();
|
||||
}elsif(s=="x"){
|
||||
content~="x";
|
||||
while(1){
|
||||
if(next()>=len)
|
||||
break;
|
||||
if(("0"[0]<=s[0] and s[0]<="9"[0]) or ("a"[0]<=s[0] and s[0]<='f') or ("A"[0]<=s[0] or s[0]<="F"))
|
||||
content~=s;
|
||||
else
|
||||
break;
|
||||
}
|
||||
content~="</code>";
|
||||
prev();
|
||||
}elsif(("0"[0]<=s[0] and s[0]<="9"[0]) or s=="." or s=="e"){
|
||||
while("0"[0]<=s[0] and s[0]<="9"[0]){
|
||||
content~=s;
|
||||
if(next()>=len)
|
||||
break;
|
||||
}
|
||||
if(s=="."){
|
||||
content~=s;
|
||||
if(next()>=len)
|
||||
break;
|
||||
}
|
||||
while("0"[0]<=s[0] and s[0]<="9"[0]){
|
||||
content~=s;
|
||||
if(next()>=len)
|
||||
break;
|
||||
}
|
||||
if(s=="e"){
|
||||
content~=s;
|
||||
if(next()>=len)
|
||||
break;
|
||||
if(s=="-" or s=="+"){
|
||||
content~=s;
|
||||
if(next()>=len)
|
||||
break;
|
||||
}
|
||||
}
|
||||
while("0"[0]<=s[0] and s[0]<="9"[0]){
|
||||
content~=s;
|
||||
if(next()>=len)
|
||||
break;
|
||||
}
|
||||
prev();
|
||||
content~="</code>";
|
||||
}else{
|
||||
prev();
|
||||
content~="</code>";
|
||||
}
|
||||
}elsif(s=="\"" or s=="'" or s=="`"){
|
||||
var quot=s~""; # generate a new string
|
||||
content~="<code class=\"str\">"~s;
|
||||
while(1){
|
||||
if(next()>=len)
|
||||
break;
|
||||
if(s==quot){
|
||||
content~=s~"</code>";
|
||||
break;
|
||||
}elsif(s=="\\"){
|
||||
content~=s;
|
||||
if(next()>=len)
|
||||
break;
|
||||
content~=s;
|
||||
}elsif(s==">"){
|
||||
content~=">";
|
||||
}elsif(s=="<"){
|
||||
content~="<";
|
||||
}else{
|
||||
content~=s;
|
||||
}
|
||||
}
|
||||
}elsif(s=="#"){
|
||||
content~="<code class=\"note\">"~s;
|
||||
while(1){
|
||||
if(next()>=len)
|
||||
break;
|
||||
if(s=="\n" or s=="\r"){
|
||||
content~=s;
|
||||
break;
|
||||
}elsif(s==">"){
|
||||
content~=">";
|
||||
}elsif(s=="<"){
|
||||
content~="<";
|
||||
}else{
|
||||
content~=s;
|
||||
}
|
||||
}
|
||||
content~="</code>";
|
||||
}
|
||||
else
|
||||
content~=s;
|
||||
}
|
||||
println("[",os.time(),"] analyzed [",filename,"] for ",timer.elapsedMSec(),"ms");
|
||||
return content;
|
||||
}
|
||||
|
||||
var respond={
|
||||
ok:func(html){
|
||||
|
@ -65,34 +270,57 @@ var files=func(){
|
|||
}();
|
||||
|
||||
while(1){
|
||||
var client=socket.accept(sd);
|
||||
var recieve_data=socket.recv(client.sd,1024);
|
||||
if(!recieve_data.size){
|
||||
println("[",os.time(),"] ",client.ip," request connection closed");
|
||||
var client=http.accept();
|
||||
var data=http.recv(client);
|
||||
if(data==nil){
|
||||
http.disconnect(client);
|
||||
continue;
|
||||
}
|
||||
var first=split("\n",recieve_data.str)[0];
|
||||
var (type,path)=split(" ",first)[0,1];
|
||||
println("[",os.time(),"] ",client.ip," request ",type," [",path,"]");
|
||||
if(path=="/" or path=="/index")
|
||||
socket.send(client.sd,respond.ok(io.fin("./doc/nasal-http-test-web.html")));
|
||||
elsif(path=="/favicon.ico")
|
||||
socket.send(client.sd,respond.ok(io.fin("./pic/favicon.ico")));
|
||||
elsif(path=="/pic/nasal.png" or path=="/pic/benchmark.png" or path=="/pic/mandelbrot.png")
|
||||
socket.send(client.sd,respond.ok(io.fin("."~path)));
|
||||
else{
|
||||
var filename=substr(path,1,size(path)-1);
|
||||
if(contains(files,filename)){
|
||||
# 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)));
|
||||
if(data.type=="GET"){
|
||||
var path=data.path;
|
||||
var args=split("?",path);
|
||||
var tmp={};
|
||||
if(size(args)==2){
|
||||
path=args[0];
|
||||
args=split("=",args[1]);
|
||||
for(var i=0;i<size(args);i+=2)
|
||||
tmp[args[i]]=args[i+1];
|
||||
}
|
||||
elsif(filename=="teapot")
|
||||
socket.send(client.sd,respond.teapot);
|
||||
else
|
||||
socket.send(client.sd,respond.not_found);
|
||||
if(path=="/" or path=="/index"){
|
||||
if(contains(tmp,"filename") and contains(files,tmp.filename)){
|
||||
var filename=tmp.filename;
|
||||
var page="<!DOCTYPE html><head><title> "~filename~" </title><meta charset=\"utf-8\">"~highlight_style~"</head>\n<body><pre>\n";
|
||||
var page_back="</pre>\n</body>\n</html>\n";
|
||||
http.send(client,respond.ok(page~html_read_file("./test/"~filename)~page_back));
|
||||
}else{
|
||||
http.send(client,respond.ok(io.fin("./doc/nasal-http-test-web.html")));
|
||||
}
|
||||
}
|
||||
elsif(path=="/shutdown"){
|
||||
http.send(client,respond.ok("http server shutdown."));
|
||||
break;
|
||||
}
|
||||
elsif(path=="/favicon.ico")
|
||||
http.send(client,respond.ok(io.fin("./pic/favicon.ico")));
|
||||
elsif(path=="/license")
|
||||
http.send(client,respond.ok(io.fin("./LICENSE")));
|
||||
elsif(path=="/pic/nasal.png" or path=="/pic/benchmark.png" or path=="/pic/mandelbrot.png")
|
||||
http.send(client,respond.ok(io.fin("."~path)));
|
||||
else{
|
||||
var filename=substr(path,1,size(path)-1);
|
||||
if(contains(files,filename)){
|
||||
var page="<!DOCTYPE html><head><title> "~filename~" </title><meta charset=\"utf-8\">"~highlight_style~"</head>\n<body><pre>\n";
|
||||
var page_back="</pre>\n</body>\n</html>\n";
|
||||
http.send(client,respond.ok(page~html_read_file("./test/"~filename)~page_back));
|
||||
}
|
||||
elsif(filename=="teapot")
|
||||
http.send(client,respond.teapot);
|
||||
else
|
||||
http.send(client,respond.not_found);
|
||||
}
|
||||
}elsif(data.type=="POST"){
|
||||
http.send(client,respond.not_found);
|
||||
}
|
||||
socket.closesocket(client.sd);
|
||||
http.disconnect(client);
|
||||
}
|
||||
socket.closesocket(sd);
|
||||
http.shutdown();
|
5481
test/mandel.nas
5481
test/mandel.nas
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue