2014-12-06 5 views
1

Я использую libsoup в своем приложении Vala для получения данных из API Instagram. Но для загрузки одной страницы требуется около 10 секунд (в то время как браузер отображает одну и ту же страницу в ~ 1-2 секунды). Сначала я думал, что это связано с тем, что HTTPS (страницы HTTPS загружают путь дольше, чем страницы HTTP), но я понял, что большую часть времени он разрешает мою самую большую часть.Как кэшировать DNS в libsoup в Вала?

Итак, вопрос в том, есть ли способ кэшировать результаты DNS, чтобы не разрешать хост каждый раз, когда мне нужно подключение к нему? Или это возможно?

Вот функция, я использую:.

public string getResponse (string host) 
{ 
    var session = new Soup.Session(); 
    session.ssl_strict = false; 
    session.user_agent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"; 

    var message = new Soup.Message ("GET", host); 
    message.tls_errors = GLib.TlsCertificateFlags.VALIDATE_ALL; 
    message.network_event.connect((event) => { 
     if (event == SocketClientEvent.RESOLVING) print("RESOLVING\n"); 
     if (event == SocketClientEvent.RESOLVED) print("RESOLVED\n"); 
     if (event == SocketClientEvent.CONNECTING) print("CONNECTING\n"); 
     if (event == SocketClientEvent.CONNECTED) print("CONNECTED\n"); 
     if (event == SocketClientEvent.PROXY_NEGOTIATING) print("PROXY_NEGOTIATING\n"); 
     if (event == SocketClientEvent.PROXY_NEGOTIATED) print("PROXY_NEGOTIATED\n"); 
     if (event == SocketClientEvent.TLS_HANDSHAKING) print("TLS_HANDSHAKING \n"); 
     if (event == SocketClientEvent.TLS_HANDSHAKED) print("TLS_HANDSHAKED\n"); 
     if (event == SocketClientEvent.COMPLETE) print("COMPLETE\n"); 
    }); 

    print("start sending\n"); 
    session.send_message (message); 
    print("stop sending\n"); 
    return (string) message.response_body.data; 
} 

и большую часть времени загрузки между «разрешающего» и «ПОСТАНОВИЛИ

Btw, я подумал, что это хорошая идея, чтобы установить какое-то поле в GSettings для хранения IP-адреса сервера Instagram API и замены имени хоста на этот IP-адрес будет работать? И если это произойдет, то как его реализовать?

ответ

1

Я переписал функцию getResponse таким образом, и теперь он работает так Я хотел этого.

public string getResponse (string host) 
{ 
    var ip = loadAddress(); 
    if (ip == "") 
     ip = resolveHost(); 

    var newHost = replaceHostWithIp(host, ip); 

    var session = new Soup.Session(); 
    session.ssl_strict = false; 
    session.user_agent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"; 

    var message = new Soup.Message ("GET", newHost); 
    message.tls_errors = GLib.TlsCertificateFlags.VALIDATE_ALL; 

    message.request_headers.append("Host", "api.instagram.com"); 

    session.send_message (message); 

    if (loadAddress() == "") 
     setAddress(ip); 

    return (string) message.response_body.data; 
} 

loadAddress(), где и setAddress() являются функциями, которые загружаются из IP-GSettings и устанавливает его и replaceHostWithIp() является функцией, которая заменяет api.instagram.com с заданным IP-адресом.

+0

Теперь, когда instagram изменяет свой IP-адрес, ваш код больше никогда не будет работать ... Не отличное решение. Возможно, было бы более полезно попытаться выяснить, почему ваш DNS настолько медленный: я уверен, что libsoup просто использует GIO, который по сути вызывает вызов getaddrinfo(), и по какой-то причине ваша операционная система занимает очень много времени, чтобы решить адрес. – jku

+0

Я знаю, я думаю, что я обработаю это позже. Странная вещь: http://api.instagram.com решает быстро, и https://api.instagram.com решает очень медленно, хотя IP-адрес тот же, я думаю. – serge1peshcoff

+0

@jku btw, можете ли вы предложить мне, как это понять? Я попытался использовать libcurl вместо libsoup (я читал это быстрее), и у него был тот же результат, поэтому я думаю, что это не проблема библиотеки. – serge1peshcoff

 Смежные вопросы

  • Нет связанных вопросов^_^