So-net無料ブログ作成

Socket Debuggerを使ってみる! ポート:8!簡単なWeb Server [NETWORK]

SocketDebugger

こことか、 https://www.udom.co.jp/sdg/
こことか、 http://sdg.ex-group.jp/lua.html

をまず見てね!

なにか意味が有るのかと思わなくもないが、沈みかかった船なのでWeb Serverとか

webServer_002.pngWeb ServerをSocket Debugger上に構築してブラウザからアクセスしてみた様子。内容はindex.htmlファイルとしてディスク上に保存、それを読み出す。


webServer_001.pngPCのブラウザとのやり取りの様子。


恒例のluaスクリプト
---------------------------------------------
-- 接続完了通知
---------------------------------------------
function OnConnected()
  Logput(1,'OnConnected')

  recvHttpTable = {}

  return 0
end
---------------------------------------------
-- 送信ボタン押下
---------------------------------------------
function OnSendPush()
    Logput(1,'OnSendPush')
    a = GetEditorData()
    SendData(a)
    return 0
end
---------------------------------------------
-- タイマー通知
---------------------------------------------
function OnTimer(id)
    Logput(1,'OnTimer')
    return 0
end
---------------------------------------------
-- 受信通知
-- 0x0D is CR,0x0A is LF
---------------------------------------------
function OnReceive(recv)
  Logput(1,'OnReceive')

  recvHttpTable = tableConcat( recvHttpTable, recv )
  if #recvHttpTable < 4 then return 0 end

  result = httpRequest( recvHttpTable )
  if result ~= 0 then
--[[
    if result == 200 then
    elseif result == 400 then
    elseif result == 404 then
    elseif result == 405 then
    else
    end
]]
    Disconnect()
  end

  return 0
end
---------------------------------------------
-- 切断通知
---------------------------------------------
function OnDisConnected()
  Logput(1,'OnDisConnected')
  Disconnect()
  return 0
end

---------------------------------------------
-- ASCIIテーブルをコード変換後に文字列化
--
-- ASCIIの例
-- 入力: { 0x30, 0x31, 0x32 }
-- 返値: "012"
--  http://amlaid.air-nifty.com/blog/2015/10/serial-debugger.html
-- 0x0D is CR,0x0A is LF
---------------------------------------------
function CharFromTbl(tbl)
  tblChar = {}

  for i=1, #tbl do
    if tbl[i] == 0x0D or 
       tbl[i] == 0x0A then
      tblChar[i] = string.char(tbl[i])
    else
      tblChar[i] = string.char(tbl[i])
    end
  end

  return table.concat(tblChar)
end


---------------------------------------------
-- table concat
---------------------------------------------
function tableConcat( tableA, tableB )
  local tableALen = #tableA

  for i = 1, #tableB do
    tableA[ tableALen + i ] = tableB[i]
  end

  return tableA
end


---------------------------------------------
-- http request
---------------------------------------------
function httpRequest( request )
  local len = #request
  local result = 0

  if request[len - 3] == 0x0D and
     request[len - 2] == 0x0A and 
     request[len - 1] == 0x0D and 
     request[len - 0] == 0x0A then
    Logput( 1, 'end of the request message.' )

    local line1 = getLine( request )

    local pos
    local method,url,httpVersion
    method,pos = split( line1, 0x20 )  -- 0x20 is ascii space
    line1 = tableCopyFrom( line1, pos + 1 )
    url,pos = split( line1, 0x20 )  -- 0x20 is ascii space
    httpVersion,pos = tableCopyFrom( line1, pos + 1 )

    local methodStr = CharFromTbl( method )
    if string.match( methodStr, 'GET' ) ~= nil then
      local data = methodGet( url,httpVersion )
      if data ~= nil then 
        index200( data )
        result = 200
      else
        index404()
        result = 404
      end
    elseif string.match( methodStr, 'PUT' ) ~= nil then
      index405()
      result = 405
    elseif string.match( methodStr, 'POST' ) ~= nil then
      index405()
      result = 405
    elseif string.match( methodStr, 'DELETE' ) ~= nil then
      index405()
      result = 405
    else
      index400()
      result = 400
    end
  end

  return result
end


---------------------------------------------
-- method get
---------------------------------------------
function methodGet( url, ver )
  local urlLen = #url
  local file = {}

  if urlLen == 1 then
    if url[1] == 0x2F then  -- 0x2F is /
      file = FileRead( "D:\\temp\\index.html" )
    else
      file = nil
    end
  else
    local urlStr = CharFromTbl( url )
    if string.match( urlStr, '/index.html' ) ~= nil or
       string.match( urlStr, '/index.htm' ) ~= nil then
      file = FileRead( "D:\\temp\\index.html" )
    else
      file = nil
    end
  end

  return file
end


---------------------------------------------
-- http request status code = 200
---------------------------------------------
function index200( data )
  local contentLength = #data
  local contentHeader = 'HTTP/1.1 200 OK\r\n'
    .. 'Server: SocketeEbugger Web Server/ ver.0.1\r\n'
    .. 'Content-Type: text/html; charset=UTF-8\r\n'
    .. 'Content-Length: '
    .. contentLength
    .. '\r\n'
    .. 'Connection: close\r\n\r\n'

  SendData( contentHeader )
  SendData( data )
end


---------------------------------------------
-- http request status code = 404
---------------------------------------------
function index404()
  local contentHeader = 'HTTP/1.0 404 Not Found\r\n'
    .. 'Connection: close\r\n\r\n'
    .. '<html><head><title>404 Not Found</title></head>\r\n'
    .. '<body>\r\n'
    .. '<h1>Not Found</h1>\r\n'
    .. '</body></html>\r\n'

  SendData( contentHeader )
end


---------------------------------------------
-- http request status code = 400
---------------------------------------------
function index400()
  local contentHeader = 'HTTP/1.0 400 Bad Request\r\n'
    .. 'Connection: close\r\n\r\n'
    .. '<html><head><title>400 Bad Request</title></head>\r\n'
    .. '<body>\r\n'
    .. '<h1>Bad Request</h1>\r\n'
    .. '</body></html>\r\n'

  SendData( contentHeader )
end


---------------------------------------------
-- http request status code = 405
---------------------------------------------
function index405()
  local contentHeader = 'HTTP/1.0 405 Method Not Allowed\r\n'
    .. 'Connection: close\r\n\r\n'
    .. '<html><head><title>405 Method Not Allowed</title></head>\r\n'
    .. '<body>\r\n'
    .. '<h1>Method Not Allowed</h1>\r\n'
    .. '</body></html>\r\n'

  SendData( contentHeader )
end


---------------------------------------------
-- get line from string
---------------------------------------------
function getLine( strTbl )
  local line = {}

  -- search line
  position = getDelimiterPosition( strTbl, 0x0D )  -- 0x0D is CR
  if position == 0 then return nil end

  position = position + 1
  for i = 1, position do
    line[i] = strTbl[i]
  end

  return line
end

---------------------------------------------
-- split table
---------------------------------------------
function split( tbl, delimiter )
  local index = 1
  local copyTbl = {}

  for i = 1, #tbl do
    if tbl[i] == delimiter then break end
    index = index + 1
    copyTbl[i] = tbl[i]
  end

  if index > #tbl then return nil,0 end

  return copyTbl,index
end

---------------------------------------------
-- get delimiter position
---------------------------------------------
function getDelimiterPosition( tbl, delimiter )
  local index = 1

  for i = 1, #tbl do
    if tbl[i] == delimiter then break end
    index = index + 1
  end

  if index > #tbl then return 0 end

  return index
end


---------------------------------------------
-- table copy from
---------------------------------------------
function tableCopyFrom( tbl, pos )
  local copyTbl = {}
  local index = 1

  for i = pos, #tbl do
    copyTbl[ index ] = tbl[ i ]
    index = index + 1
  end

  return copyTbl
end


PCのコントロールキーのパッドの中にちっさなゴミが入ったのか、気になって仕方がない、、、
※もう少し上手く書ける気がする。修行が足らん、、、









nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。