public BrokerMessage process(BrokerMessage request)
        {
            Data bodyData = Serializer.Serialize(request);
            log.debug(bodyData, "bodyData");

            Entity entity = new DataEntity(bodyData);
            String requestUri;
            if (null == _authenticator)
            {
                requestUri = "/_dynamic_/open/services";
            }
            else
            {
                if (_authenticator.AuthInt)
                {
                    requestUri = "/_dynamic_/auth-int/services";
                }
                else
                {
                    requestUri = "/_dynamic_/auth/services";
                }
            }
            HttpRequestAdapter requestAdapter = new HttpRequestAdapter(requestUri);
            requestAdapter.RequestEntity = entity;

            _httpDispatcher.post(requestAdapter, _authenticator, _responseHandler);
            return _responseHandler.getResponse();
        }
        private static Entity toEntity(int statusCode)
        {

            String statusString = HttpStatus.getReason(statusCode);

            String responseTemplate = "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\"><html><head><title>{0} {1}</title></head><body><h1>{2}</h1></body></html>";
            
            String messageBody = String.Format(responseTemplate, statusCode, statusString, statusString);

            byte[] utf8Bytes = StringHelper.ToUtfBytes(messageBody);
            Data data = new Data(utf8Bytes);

            Entity answer = new DataEntity(data);
            return answer;
        }
        // can return null
        private static DataEntity toDataEntity(Entity entity)
        {
            if (null == entity)
            {
                return null;
            }

            if (entity is DataEntity)
            {
                return (DataEntity)entity;
            }

            // limit of 64K
            if (entity.getContentLength() > 64 * 1024)
            {
                log.errorFormat("entity.getContentLength() > 64 * 1024; entity.getContentLength() = {0}", entity.getContentLength());
                throw HttpErrorHelper.requestEntityTooLarge413FromOriginator(typeof(AuthIntRequestHandler));
            }

            Data data = new Data(entity.getContent(), (int)entity.getContentLength());
            DataEntity answer = new DataEntity(data);
            return answer;
        }
        internal static HttpResponse processPostRequest(ServicesRegistery servicesRegistery, HttpRequest request)
        {

            if (HttpMethod.POST != request.Method)
            {
                log.errorFormat("unsupported method; request.Method = '{0}'", request.Method);
                throw HttpErrorHelper.badRequest400FromOriginator(typeof(ServicesRequestHandler));
            }


            Entity entity = request.Entity;
            if (_MAXIMUM_REQUEST_ENTITY_LENGTH < entity.getContentLength())
            {
                log.errorFormat("_MAXIMUM_REQUEST_ENTITY_LENGTH < entity.getContentLength(); _MAXIMUM_REQUEST_ENTITY_LENGTH = {0}; entity.getContentLength() = {1}", _MAXIMUM_REQUEST_ENTITY_LENGTH, entity.getContentLength());
                throw HttpErrorHelper.requestEntityTooLarge413FromOriginator(typeof(ServicesRequestHandler));
            }

            Data data = GetData(entity);

            BrokerMessage call = Serializer.deserialize(data);
            BrokerMessage response = process(servicesRegistery, call);

            HttpResponse answer;
            {
                if (BrokerMessageType.ONEWAY == call.getMessageType())
                {
                    answer = new HttpResponse(HttpStatus.NO_CONTENT_204);
                }
                else
                {
                    Data responseData = Serializer.Serialize(response);
                    Entity responseBody = new DataEntity(responseData);
                    answer = new HttpResponse(HttpStatus.OK_200, responseBody);
                }
            }

            return answer;


        }