Пользовательский ответ сервера Apache на основе xampp / wamp - PullRequest
0 голосов
/ 20 февраля 2012

Как я могу отправить пользовательский ответ на пользовательский запрос на сервер Apache на базе xampp / wamp при подключении к определенному порту?

Я пытаюсь ответить на запрос \ 0, который запрашивает флэш-приложение, чтобы разрешить http-запрос GET между доменами.

Запрос политики флэш-памяти сделан по умолчанию для порта 843, и я бы хотел оставить его таким.

Порт должен получить \ 0 (оканчивающийся нулевым символом, \ 0 только для справки) и отвечающий что-то вроде:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
    <cross-domain-policy>
        <site-control permitted-cross-domain-policies="master-only"/>
        <allow-http-request-headers-from domain="*" headers="*" secure="true" />
      <allow-access-from domain="*" to-ports="*" />
    </cross-domain-policy>

Насколько я знаю, запрос должен быть возвращен в виде простого текста, хотя может понадобиться и Content-type.

Я попытался использовать следующее: http://socketpolicyserver.com/ и, хотя он прослушивает порт и принимает подключения, он не отвечает с указанным xml по запросу.

Буду признателен за любые методы / способы получения правильного ответа,

относительно

Mike.

! --- UPDATE --->

Я написал простой веб-сервер на C #, который прослушивает порт 843 и обслуживает вышеупомянутую политику - однако он отлично работал при использовании соединения SecureSocket для безопасного соединения (т. Е. Открытие сокета для протокола HTTPS / SSL ) - отправленный запрос зашифрован с использованием сертификата хостов. Насколько я знаю, нет никакого способа прослушивания или получения сертификата сервера и дешифрования данных с помощью внешнего приложения, следовательно, единственный способ - как-то «научить» Apache отвечать междоменной политикой после того, как правильный запрос отправлен через соответствующий порт.

Еще одна идея, которая у меня есть, - это прочитать файл сертификата сервера, хранящийся в каталоге Apache, независимо от того, что происходит на самом сервере, хотя в некоторых случаях это излишнее.

Хотелось бы услышать ваши комментарии,

Mike.

1 Ответ

0 голосов
/ 26 февраля 2012

Итак, вот как я в конце концов решил это:

Я использовал этот код парня с некоторыми изменениями: http://www.switchonthecode.com/tutorials/csharp-tutorial-simple-threaded-tcp-server

и создал простой многопоточный веб-сервер, который прослушивает порт 843,и предоставляет несколько общих правил для соответствующего запроса флэш-памяти.

Было несколько примеров, предоставленных Adobe, но по некоторым причинам окнам они не нравились.

Также обратите внимание, что если вы используете объект FlashSocket во флэш-памяти, он предположительно должен использовать учетные данные SSL целевых серверов (IIS / Apache / Tomcats и т. Д.) И инициировать аутентификацию клиента с использованием общедоступнойключ сертификата целевых серверов, но, опять же, он может и не быть, поэтому этот код не имеет поддержки SSL, хотя я начал реализовывать его с использованием потоков C # SSL, но пока безуспешно.Если вы можете заставить его работать через SSL, пожалуйста, дайте мне знать.

Надеюсь, этот код поможет,

Майк.

using System;
using System.Text;
using System.Net.Sockets;
using System.Threading;
using System.Net;
using System.IO;

namespace TCPSexyServer
{
    class Server
{
    private TcpListener tcpListener;
    private Thread listenThread;

    private void ListenForClients(int p)
    {
        throw new NotImplementedException();
    }

    public Server()
    {
        this.tcpListener = new TcpListener(IPAddress.Any, 843);
        this.listenThread = new Thread(new ThreadStart(ListenForClients));
        this.listenThread.Start();
    }

    private void ListenForClients()
    {
        this.tcpListener.Start();

        while (true)
        {
            //blocks until a client has connected to the server
            TcpClient client = this.tcpListener.AcceptTcpClient();

            //create a thread to handle communication 
            //with connected client
            Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
            clientThread.Start(client);
        }
    }

    private void HandleClientComm(object client)
    {
        TcpClient tcpClient = (TcpClient)client;
        NetworkStream clientStream = tcpClient.GetStream();
        byte[] message = new byte[4096];
        int bytesRead;

        while (true)
        {
            bytesRead = 0;

            try
            {
                //blocks until a client sends a message
                bytesRead = clientStream.Read(message, 0, 4096);
            }
            catch
            {
                //a socket error has occured
                break;
            }

            if (bytesRead == 0)
            {
                //the client has disconnected from the server
                break;
            }

            //message has successfully been received

            UTF8Encoding encoder = new UTF8Encoding();

            string sentData = encoder.GetString(message, 0, bytesRead);
            Console.WriteLine(sentData);
            if (sentData == "<policy-file-request/>\0")
            {
                String policy = "<?xml version=\"1.0\"?>\n" +
                                "<!DOCTYPE cross-domain-policy SYSTEM \"/xml/dtds/cross-domain-policy.dtd\">\n" +
                                "<cross-domain-policy>\n" +
                                "<site-control permitted-cross-domain-policies=\"master-only\"/>\n" +
                                "<allow-http-request-headers-from domain=\"*\" headers=\"*\" secure=\"true\" />\n" +
                                "<allow-access-from domain=\"*\" to-ports=\"*\" />\n" +
                                "</cross-domain-policy>\0";
                byte[] buffer = encoder.GetBytes(policy);
                clientStream.Write(buffer, 0, buffer.Length);
                clientStream.Flush();
                Console.WriteLine(policy);
            }
            else
            {
                tcpClient.Close();
            }
            System.Diagnostics.Debug.WriteLine(encoder.GetString(message, 0, bytesRead));
        }

        tcpClient.Close();
    }

        public static void Main(string[] args)
        {
            Server blah = new Server();
       }

    }
}
...