1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-07-24 16:24:40 -04:00
elinks/test/server/crlf.py
Peter Collingbourne 658b9cc70f Fixed bug relating to newlines in hidden input fields
This patch fixes an issue whereby a newline character appearing within
a hidden input field is incorrectly reinterpreted as a space character.
The patch handles almost all cases, and includes a test case.
15/18 tests pass, but the remainder currently fail due to the fact
that ELinks does not currently support textarea scripting.
2008-11-09 23:28:46 +02:00

122 lines
2.4 KiB
Python
Executable File

#!/usr/bin/env python
import os
from BaseHTTPServer import *
import tempfile
import signal
r, w = os.pipe()
C_CR = 0
C_LF = 1
C_CRLF = 2
E_Raw = 0
E_Entity = 1
E_JavaScript = 2
F_Hidden = 0
F_TextArea = 1
def encode(ch, encoding):
if ch == C_CRLF:
return encode(C_CR, encoding) + encode(C_LF, encoding)
if ch == C_CR:
if encoding == E_Raw:
return "\r"
if encoding == E_JavaScript:
return "\\r"
if encoding == E_Entity:
return "
"
if ch == C_LF:
if encoding == E_Raw:
return "\n"
if encoding == E_JavaScript:
return "\\n"
if encoding == E_Entity:
return "
"
def get_form(ch, encoding, field):
text = "foo" + encode(ch, encoding) + "bar"
if encoding == E_JavaScript:
text_initial = ""
else:
text_initial = text
s = """<html>
<head>
<title>Form Test</title>
</head>
<body>
<form id="form1" name="form1" action="http://127.0.0.1:8090/">
"""
if field == F_Hidden:
s += '<input type="hidden" id="field1" name="field1" value="' + text_initial + '">'
elif field == F_TextArea:
s += '<textarea id="field1" name="field1">' + text_initial + '</textarea>'
s += "\n</form>"
if encoding == E_JavaScript:
s += """
<script>
document.form1.field1.value = '%s';
</script>""" % (text)
s += "</body></html>"
return s
class forwarder(BaseHTTPRequestHandler):
def do_GET(self):
w.write(self.path + "\n")
w.flush()
self.send_response(200)
self.send_header("Content-Type", "text/plain")
self.end_headers()
self.wfile.write("Dummy response")
def runtest(r, *args):
form = get_form(*args)
tmpfile, tmpname = tempfile.mkstemp(".html")
tmpfile = os.fdopen(tmpfile, 'w')
tmpfile.write(form)
tmpfile.close()
linkspid = os.spawnlp(os.P_NOWAIT, 'elinks', 'elinks',
'-config-dir', os.getcwd(),
'-config-file', 'crlf.conf',
'-no-connect', '1',
'-auto-submit', '1',
tmpname)
path = r.readline()
os.kill(linkspid, signal.SIGINT)
os.waitpid(linkspid, 0)
os.unlink(tmpname)
return path
pid = os.fork()
if pid:
os.close(w)
r = os.fdopen(r)
paths = []
for c in [C_CR, C_LF, C_CRLF]:
for e in [E_Raw, E_Entity, E_JavaScript]:
for f in [F_Hidden, F_TextArea]:
paths.append(("%d %d %d " % (c, e, f)) + runtest(r, c, e, f))
for path in paths:
print path,
os.kill(pid, signal.SIGTERM)
os.waitpid(pid, 0)
else:
os.close(r)
w = os.fdopen(w, 'w')
server_address = ('127.0.0.1', 8090)
httpd = HTTPServer(server_address, forwarder)
httpd.serve_forever()