python requests: monkeypatching HTTPConnection to set socket options












0















I am trying to enable TCP keepalives in a Python app, and am having trouble setting sockopts. I'm using the requests package for this.



The approach I tried was suggested in this response to a very similar question. The user says:




requests uses urllib3, which uses the standard library's http.client (or httplib, for 2.x), which calls socket.create_connection, all without anywhere to hook things.




Here is a reproduction of the code snippet given there, adapted to work with python 2:



orig_connect = httplib.HTTPConnection.connect

def monkey_connect(self):
orig_connect(self)
self.sock.setsockopt(…)
# raise Exception

httplib.HTTPConnection.connect = monkey_connect

import requests
response = requests.get('http://www.google.com')
print response.status_code


The request succeeds. Next, to check that the monkeypatch is actually doing something, I added the exception which is commented out in the code snippet above. I figured that if I try to do a request, it will call HTTPConnection, and the exception will be raised. But no, I just get a 200 response as usual.



Because of this my feeling is that requests is not really using the HTTPConnection class as explained in the answer I linked to. Unfortunately, after digging through the code for some time, I'm unable to work my way back from a simple get request to the socket layer (I'm not at all familiar with the internal workings of the package).



Does anybody have any insight into how I can set a socket option in this way? The code base I'm working with uses requests.get(...), so I don't think I can simply create a Session and mount a socket adapter onto it.



The versions (I don't have control over this, unfortunately) are as follows:



python 2.7.14



requests 2.13.0



urllib3 1.20.0










share|improve this question























  • you should watch the second answer, because he really did it. And your feeling is right. you have to initialize HTTPAdapter again after resetting socket(like second answer s.mount())

    – kcorlidy
    Nov 27 '18 at 8:13
















0















I am trying to enable TCP keepalives in a Python app, and am having trouble setting sockopts. I'm using the requests package for this.



The approach I tried was suggested in this response to a very similar question. The user says:




requests uses urllib3, which uses the standard library's http.client (or httplib, for 2.x), which calls socket.create_connection, all without anywhere to hook things.




Here is a reproduction of the code snippet given there, adapted to work with python 2:



orig_connect = httplib.HTTPConnection.connect

def monkey_connect(self):
orig_connect(self)
self.sock.setsockopt(…)
# raise Exception

httplib.HTTPConnection.connect = monkey_connect

import requests
response = requests.get('http://www.google.com')
print response.status_code


The request succeeds. Next, to check that the monkeypatch is actually doing something, I added the exception which is commented out in the code snippet above. I figured that if I try to do a request, it will call HTTPConnection, and the exception will be raised. But no, I just get a 200 response as usual.



Because of this my feeling is that requests is not really using the HTTPConnection class as explained in the answer I linked to. Unfortunately, after digging through the code for some time, I'm unable to work my way back from a simple get request to the socket layer (I'm not at all familiar with the internal workings of the package).



Does anybody have any insight into how I can set a socket option in this way? The code base I'm working with uses requests.get(...), so I don't think I can simply create a Session and mount a socket adapter onto it.



The versions (I don't have control over this, unfortunately) are as follows:



python 2.7.14



requests 2.13.0



urllib3 1.20.0










share|improve this question























  • you should watch the second answer, because he really did it. And your feeling is right. you have to initialize HTTPAdapter again after resetting socket(like second answer s.mount())

    – kcorlidy
    Nov 27 '18 at 8:13














0












0








0








I am trying to enable TCP keepalives in a Python app, and am having trouble setting sockopts. I'm using the requests package for this.



The approach I tried was suggested in this response to a very similar question. The user says:




requests uses urllib3, which uses the standard library's http.client (or httplib, for 2.x), which calls socket.create_connection, all without anywhere to hook things.




Here is a reproduction of the code snippet given there, adapted to work with python 2:



orig_connect = httplib.HTTPConnection.connect

def monkey_connect(self):
orig_connect(self)
self.sock.setsockopt(…)
# raise Exception

httplib.HTTPConnection.connect = monkey_connect

import requests
response = requests.get('http://www.google.com')
print response.status_code


The request succeeds. Next, to check that the monkeypatch is actually doing something, I added the exception which is commented out in the code snippet above. I figured that if I try to do a request, it will call HTTPConnection, and the exception will be raised. But no, I just get a 200 response as usual.



Because of this my feeling is that requests is not really using the HTTPConnection class as explained in the answer I linked to. Unfortunately, after digging through the code for some time, I'm unable to work my way back from a simple get request to the socket layer (I'm not at all familiar with the internal workings of the package).



Does anybody have any insight into how I can set a socket option in this way? The code base I'm working with uses requests.get(...), so I don't think I can simply create a Session and mount a socket adapter onto it.



The versions (I don't have control over this, unfortunately) are as follows:



python 2.7.14



requests 2.13.0



urllib3 1.20.0










share|improve this question














I am trying to enable TCP keepalives in a Python app, and am having trouble setting sockopts. I'm using the requests package for this.



The approach I tried was suggested in this response to a very similar question. The user says:




requests uses urllib3, which uses the standard library's http.client (or httplib, for 2.x), which calls socket.create_connection, all without anywhere to hook things.




Here is a reproduction of the code snippet given there, adapted to work with python 2:



orig_connect = httplib.HTTPConnection.connect

def monkey_connect(self):
orig_connect(self)
self.sock.setsockopt(…)
# raise Exception

httplib.HTTPConnection.connect = monkey_connect

import requests
response = requests.get('http://www.google.com')
print response.status_code


The request succeeds. Next, to check that the monkeypatch is actually doing something, I added the exception which is commented out in the code snippet above. I figured that if I try to do a request, it will call HTTPConnection, and the exception will be raised. But no, I just get a 200 response as usual.



Because of this my feeling is that requests is not really using the HTTPConnection class as explained in the answer I linked to. Unfortunately, after digging through the code for some time, I'm unable to work my way back from a simple get request to the socket layer (I'm not at all familiar with the internal workings of the package).



Does anybody have any insight into how I can set a socket option in this way? The code base I'm working with uses requests.get(...), so I don't think I can simply create a Session and mount a socket adapter onto it.



The versions (I don't have control over this, unfortunately) are as follows:



python 2.7.14



requests 2.13.0



urllib3 1.20.0







python python-2.7 python-requests






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 26 '18 at 19:43









LachyLachy

1103




1103













  • you should watch the second answer, because he really did it. And your feeling is right. you have to initialize HTTPAdapter again after resetting socket(like second answer s.mount())

    – kcorlidy
    Nov 27 '18 at 8:13



















  • you should watch the second answer, because he really did it. And your feeling is right. you have to initialize HTTPAdapter again after resetting socket(like second answer s.mount())

    – kcorlidy
    Nov 27 '18 at 8:13

















you should watch the second answer, because he really did it. And your feeling is right. you have to initialize HTTPAdapter again after resetting socket(like second answer s.mount())

– kcorlidy
Nov 27 '18 at 8:13





you should watch the second answer, because he really did it. And your feeling is right. you have to initialize HTTPAdapter again after resetting socket(like second answer s.mount())

– kcorlidy
Nov 27 '18 at 8:13












0






active

oldest

votes











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53487948%2fpython-requests-monkeypatching-httpconnection-to-set-socket-options%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























0






active

oldest

votes








0






active

oldest

votes









active

oldest

votes






active

oldest

votes
















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53487948%2fpython-requests-monkeypatching-httpconnection-to-set-socket-options%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Contact image not getting when fetch all contact list from iPhone by CNContact

count number of partitions of a set with n elements into k subsets

A CLEAN and SIMPLE way to add appendices to Table of Contents and bookmarks