как получить ip клиента в методе веб-сервиса мыла? - PullRequest
0 голосов
/ 05 августа 2011

Я использую библиотеку soaplib для веб-служб SOAP, я хочу получить доступ к IP-адресу клиента, когда в моем методе веб-службы сделан запрос клиента.

class HelloWorldService(DefinitionBase):
    @soap(String, Integer, _returns=Array(String))
    def say_hello(self, name, times):
        # here I want to Access client's IP Address
        pass

Вот псевдокод моего Сервера...

server = make_server('localhost',
                     7789, 
                     HelloWorldApplication(Application([HelloWorldService], 'hello')))
print "serving http://localhost:7789/hello?wsdl"
server.serve_forever()

Ответы [ 2 ]

1 голос
/ 05 августа 2011

Из make_server Я предполагаю, что вы используете BaseHTTPServer или один из пакетов, который на нем построен.

В вашем коде обработки запросов выдолжен быть в состоянии найти ссылку на клиентский сокет.Используйте это, чтобы получить getsockname() и получить IP-адрес клиента и исходный порт TCP.

Например, если ссылка на сокет была в базовом классе как socket, вы могли бы:

class HelloWorldService(DefinitionBase):
    @soap(String, Integer, _returns=Array(String))
    def say_hello(self, name, times):
        # here I want to Access client's IP Address
        print "Client IP:", self.socket.getsockname()[0]

Мой взломанный пример получения IP-адреса прослушивающего сокета на сервере: (это не клиентский сокет!)

>>> httpd = make_server('', 8000, simple_app)
>>> dir(httpd)
['RequestHandlerClass', '_BaseServer__is_shut_down', '_BaseServer__shutdown_request', '__doc__', '__init__', '__module__', '_handle_request_noblock', 'address_family', 'allow_reuse_address', 'application', 'base_environ', 'close_request', 'fileno', 'finish_request', 'get_app', 'get_request', 'handle_error', 'handle_request', 'handle_timeout', 'process_request', 'request_queue_size', 'serve_forever', 'server_activate', 'server_address', 'server_bind', 'server_close', 'server_name', 'server_port', 'set_app', 'setup_environ', 'shutdown', 'shutdown_request', 'socket', 'socket_type', 'timeout', 'verify_request']
>>> dir(httpd.socket)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '__weakref__', '_sock', 'accept', 'bind', 'close', 'connect', 'connect_ex', 'dup', 'family', 'fileno', 'getpeername', 'getsockname', 'getsockopt', 'gettimeout', 'listen', 'makefile', 'proto', 'recv', 'recv_into', 'recvfrom', 'recvfrom_into', 'send', 'sendall', 'sendto', 'setblocking', 'setsockopt', 'settimeout', 'shutdown', 'type']
>>> httpd.socket.getsockname()
('0.0.0.0', 8000)

Получение действительного IP-адреса клиентанемного более сложный пример, поскольку вы не получите ссылку на объект сокета клиента, пока не будет вызван обратный вызов обработчика запроса.Пример использования BaseHTTPServer:

import BaseHTTPServer

class Handler(BaseHTTPServer.BaseHTTPRequestHandler):

    def do_GET(self):
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()
        self.wfile.write("Client IP: %s" % self.connection.getsockname()[0])

httpd = BaseHTTPServer.HTTPServer(("", 8000), Handler)
httpd.serve_forever()

У меня нет soaplib в системе, чтобы дать вам более точный пример, но объект сокета где-то спрятан.

0 голосов
/ 30 октября 2011

Решено:

's/self.connection.getsockname()[0]/self.client_address[0]/' 
...