129 lines
3.4 KiB
Python
129 lines
3.4 KiB
Python
from kivy.lang import Builder
|
|
from kivy.app import App
|
|
from kivy.network.urlrequest import UrlRequest
|
|
from kivy.properties import NumericProperty, StringProperty, DictProperty
|
|
|
|
import json
|
|
|
|
|
|
KV = '''
|
|
#:import json json
|
|
#:import C kivy.utils.get_color_from_hex
|
|
|
|
BoxLayout:
|
|
orientation: 'vertical'
|
|
Label:
|
|
text: 'see https://httpbin.org for more information'
|
|
|
|
TextInput:
|
|
id: ti
|
|
hint_text: 'type url or select from dropdown'
|
|
size_hint_y: None
|
|
height: 48
|
|
multiline: False
|
|
foreground_color:
|
|
(
|
|
C('000000')
|
|
if (self.text).startswith('http') else
|
|
C('FF2222')
|
|
)
|
|
|
|
BoxLayout:
|
|
size_hint_y: None
|
|
height: 48
|
|
Spinner:
|
|
id: spinner
|
|
text: 'select'
|
|
values:
|
|
[
|
|
'http://httpbin.org/ip',
|
|
'http://httpbin.org/user-agent',
|
|
'http://httpbin.org/headers',
|
|
'http://httpbin.org/delay/3',
|
|
'http://httpbin.org/image/jpeg',
|
|
'http://httpbin.org/image/png',
|
|
'https://httpbin.org/delay/3',
|
|
'https://httpbin.org/image/jpeg',
|
|
'https://httpbin.org/image/png',
|
|
]
|
|
on_text: ti.text = self.text
|
|
|
|
Button:
|
|
text: 'GET'
|
|
on_press: app.fetch_content(ti.text)
|
|
disabled: not (ti.text).startswith('http')
|
|
size_hint_x: None
|
|
width: 50
|
|
|
|
Label:
|
|
text: str(app.status)
|
|
|
|
TextInput:
|
|
readonly: True
|
|
text: app.result_text
|
|
|
|
Image:
|
|
source: app.result_image
|
|
nocache: True
|
|
|
|
TextInput
|
|
readonly: True
|
|
text: json.dumps(app.headers, indent=2)
|
|
'''
|
|
|
|
|
|
class UrlExample(App):
|
|
status = NumericProperty()
|
|
result_text = StringProperty()
|
|
result_image = StringProperty()
|
|
headers = DictProperty()
|
|
|
|
def build(self):
|
|
return Builder.load_string(KV)
|
|
|
|
def fetch_content(self, url):
|
|
self.cleanup()
|
|
UrlRequest(
|
|
url,
|
|
on_success=self.on_success,
|
|
on_failure=self.on_failure,
|
|
on_error=self.on_error
|
|
)
|
|
|
|
def cleanup(self):
|
|
self.result_text = ''
|
|
self.result_image = ''
|
|
self.status = 0
|
|
self.headers = {}
|
|
|
|
def on_success(self, req, result):
|
|
self.cleanup()
|
|
headers = req.resp_headers
|
|
content_type = headers.get('content-type', headers.get('Content-Type'))
|
|
if content_type.startswith('image/'):
|
|
fn = 'tmpfile.{}'.format(content_type.split('/')[1])
|
|
with open(fn, 'wb') as f:
|
|
f.write(result)
|
|
self.result_image = fn
|
|
else:
|
|
if isinstance(result, dict):
|
|
self.result_text = json.dumps(result, indent=2)
|
|
else:
|
|
self.result_text = result
|
|
self.status = req.resp_status
|
|
self.headers = headers
|
|
|
|
def on_failure(self, req, result):
|
|
self.cleanup()
|
|
self.result_text = result
|
|
self.status = req.resp_status
|
|
self.headers = req.resp_headers
|
|
|
|
def on_error(self, req, result):
|
|
self.cleanup()
|
|
self.result_text = str(result)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
UrlExample().run()
|