def testCompressingResponseIfInvalidMimetype():
	"""
	Staying backwards compatible.

	Old clients connect to the server and send an "Accept" with
	the invalid mimetype "gzip-application/json-rpc".
	We must respond to these clients because not doing so could
	result in rendering an opsi landscape unresponding.

	The returned "content-type" is invalid and makes no sense.
	Correct would be "application/json".
	The returned content-encoding is "gzip" but the content
	is acutally compressed with deflate.
	"""
	testHeader = FakeDictHeader({
		"Accept": "gzip-application/json-rpc",
		"invalid": "ignoreme"
	})
	request = FakeRequest(testHeader)
	worker = WorkerOpsiJsonRpc(service=None, request=request, resource=None)

	result = worker._generateResponse(None)
	assert 200 == result.code
	assert result.headers.hasHeader('content-type')
	assert ['gzip'] == result.headers.getRawHeaders('content-encoding')
	assert ['gzip-application/json;charset=utf-8'] == result.headers.getRawHeaders('content-type')

	sdata = result.stream.read()
	data = zlib.decompress(sdata)
	assert 'null' == data
 def __init__(self, service, request, resource):
     with log_context({'instance': 'software on demand'}):
         WorkerOpsiJsonRpc.__init__(self, service, request, resource)
         self._auth_module = None
         if os.name == 'posix':
             import OPSI.Backend.Manager.Authentication.PAM  # pylint: disable=import-outside-toplevel
             self._auth_module = OPSI.Backend.Manager.Authentication.PAM.PAMAuthentication(
             )
         elif os.name == 'nt':
             import OPSI.Backend.Manager.Authentication.NT  # pylint: disable=import-outside-toplevel
             self._auth_module = OPSI.Backend.Manager.Authentication.NT.NTAuthentication(
                 "S-1-5-32-544")
def testReturningPlainCalls():
	testHeader = FakeDictHeader({"Accept": "text/plain"})
	request = FakeRequest(testHeader)
	worker = WorkerOpsiJsonRpc(service=None, request=request, resource=None)

	result = worker._generateResponse(None)
	assert 200 == result.code
	assert result.headers.hasHeader('content-type')
	assert ['application/json;charset=utf-8'] == result.headers.getRawHeaders('content-type')
	assert not result.headers.hasHeader('content-encoding')

	data = result.stream.read()
	assert 'null' == str(data)
def testHandlingSingleResultConsistingOfList():
	"""
	If a single result is made the result is a list this list must not be unpacked.
	"""
	worker = WorkerOpsiJsonRpc(service=None, request=FakeRequest(), resource=None)
	worker._rpcs = [FakeRPC(["Eins", "Zwei", "Drei"])]

	result = worker._generateResponse(None)
	assert 200 == result.code
	assert result.headers.hasHeader('content-type')
	assert ['application/json;charset=utf-8'] == result.headers.getRawHeaders('content-type')
	assert not result.headers.hasHeader('content-encoding')
	assert '["Eins", "Zwei", "Drei"]' == str(result.stream.read())
def testHandlingSingleResult():
	"""
	A single RPC result must not be returned in a list.
	"""
	worker = WorkerOpsiJsonRpc(service=None, request=FakeRequest(), resource=None)
	worker._rpcs = [FakeRPC("Hallo Welt")]

	result = worker._generateResponse(None)
	assert 200 == result.code
	assert result.headers.hasHeader('content-type')
	assert ['application/json;charset=utf-8'] == result.headers.getRawHeaders('content-type')
	assert not result.headers.hasHeader('content-encoding')
	assert '"Hallo Welt"' == str(result.stream.read())
def testReturningEmptyResponse():
	"""
	Making sure that an empty uncompressed response is returned.

	We check the headers of the request and also make sure that
	the content is "null".
	"""
	worker = WorkerOpsiJsonRpc(service=None, request=FakeRequest(), resource=None)

	result = worker._generateResponse(None)
	assert 200 == result.code
	assert result.headers.hasHeader('content-type')
	assert ['application/json;charset=utf-8'] == result.headers.getRawHeaders('content-type')
	assert not result.headers.hasHeader('content-encoding')
	assert 'null' == str(result.stream.read())
def testCompressingResponseDataWithDeflate():
	"""
	Responding with data compressed by deflate.
	"""
	testHeader = FakeHeader({"Accept-Encoding": "deflate"})
	request = FakeRequest(testHeader)
	worker = WorkerOpsiJsonRpc(service=None, request=request, resource=None)

	result = worker._generateResponse(None)
	assert 200 == result.code
	assert result.headers.hasHeader('content-type')
	assert ['application/json;charset=utf-8'] == result.headers.getRawHeaders('content-type')
	assert ['deflate'] == result.headers.getRawHeaders('content-encoding')

	sdata = result.stream.read()
	data = zlib.decompress(sdata)
	assert 'null' == data
def testHandlingMultipleRPCs():
	"""
	With multiple RPCs the results are returned in a list.

	We do not use any compression in this testcase.
	"""
	worker = WorkerOpsiJsonRpc(service=None, request=FakeRequest(), resource=None)
	worker._rpcs = [
		FakeRPC(), FakeRPC(1), FakeRPC(u"FÄKE!"),
		FakeRPC({"Narziss": "Morgen Nicht Geboren"})
	]

	result = worker._generateResponse(None)
	assert 200 == result.code
	assert result.headers.hasHeader('content-type')
	assert ['application/json;charset=utf-8'] == result.headers.getRawHeaders('content-type')
	assert not result.headers.hasHeader('content-encoding')
	assert '[null, 1, "F\xc3\x84KE!", {"Narziss": "Morgen Nicht Geboren"}]' == str(result.stream.read())
def testCompressingResponseDataWithGzip():
	"""
	Responding with data compressed by gzip.
	"""
	testHeader = FakeHeader({"Accept-Encoding": "gzip"})
	request = FakeRequest(testHeader)
	worker = WorkerOpsiJsonRpc(service=None, request=request, resource=None)

	result = worker._generateResponse(None)
	assert 200 == result.code
	assert result.headers.hasHeader('content-type')
	assert ['application/json;charset=utf-8'] == result.headers.getRawHeaders('content-type')
	assert ['gzip'] == result.headers.getRawHeaders('content-encoding')

	sdata = result.stream.read()

	with gzip.GzipFile(fileobj=StringIO(sdata), mode="r") as gzipfile:
		data = gzipfile.read()

	assert 'null' == data