1 # -*- coding: utf-8 -*-
3 # Based on webserver.py by Jon Berg (turtlemeat.com)
7 from BaseHTTPServer
import BaseHTTPRequestHandler
, HTTPServer
10 from html_generation
import *
14 htdocs_dir
= u
'htdocs'
19 #---------------------------------------------#
20 class MyHandler(BaseHTTPRequestHandler
):
23 ### actions starts with «/?»
24 if self
.path
.startswith('/?'):
25 action
= self
.path
[2:]
27 if action
== 'settings':
29 elif action
== 'chans':
30 chans_list
= get_chans_list()
31 data
= (get_chans_html(chans_list
),)
33 self
.send_error(501, 'Bad action: %s' %action
)
35 path
= '%s%s' %(htdocs_dir
, self
.path
)
36 if os
.path
.isdir(path
): path
+= '/index.html'
39 if os
.path
.exists(path
):
41 data
= (f
.read(), self
.get_content_type(path
))
45 args
= filter(None, self
.path
.split('/'))
50 boards_list
= get_boards_list(args
[0])
52 data
= (get_boards_html(boards_list
),)
54 self
.send_error(501, u
'Can\'t find boards on %s' %args
[0])
57 plugin
= get_plugin(args
[0], args
[1])
59 threads_list
= plugin
.get_threads_list(args
[0], args
[1], get_chan_settings(args
[0]))
60 data
= (get_threads_html(threads_list
, args
[0], args
[1]),)
62 self
.send_error(501, u
'Can\'t find plugin for %s/%s/' %(args
[0], args
[1]))
64 self
.send_error(404, u
'File not found: %s' %path
)
67 if len(data
) == 1: data
= (data
[0], 'text/html')
69 self
.send_response(200)
70 self
.send_header(u
'Content-type', data
[1])
72 self
.wfile
.write(misc
.to_bytes(data
[0]))
74 def get_content_type(self
, filename
):
75 return mimetypes
.guess_type(filename
)[0] or 'application/octet-stream'
77 #---------------------------------------------#
78 def start_server(_settings
, _plugins
):
79 global server
, settings
, plugins
83 server
= HTTPServer(('', settings
['daemon']['port']), MyHandler
)
84 server
.serve_forever()
86 #---------------------------------------------#
91 ###############################################
94 for chan_item
in settings
['chans']:
95 chan_name
= chan_item
.items()[0][0]
96 chans_list
.append((chan_name
, u
'/%s/' %chan
_name
))
100 def get_boards_list(_chan_name
):
102 for chan_item
in settings
['chans']:
103 chan_name
, chan_settings
= chan_item
.items()[0]
104 if _chan_name
== chan_name
:
105 for board_item
in chan_settings
['boards']:
106 board_name
= board_item
.items()[0][0]
107 boards_list
.append((board_name
, u
'/%s/%s/' %(chan_name
, board_name
)))
111 def get_plugin(_chan_name
, _board_name
):
112 for chan_item
in settings
['chans']:
113 chan_name
, chan_settings
= chan_item
.items()[0]
114 if _chan_name
== chan_name
:
115 for board_item
in chan_settings
['boards']:
116 board_name
, board_settings
= board_item
.items()[0]
117 if _board_name
== board_name
:
118 plugin_name
= board_settings
['type']
119 if plugins
.has_key(plugin_name
):
120 return plugins
[plugin_name
]
122 def get_chan_settings(_chan_name
):
123 for chan_item
in settings
['chans']:
124 chan_name
, chan_settings
= chan_item
.items()[0]
125 if _chan_name
== chan_name
: