python requests: monkeypatching HTTPConnection to set socket options
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
usesurllib3
, which uses the standard library'shttp.client
(orhttplib
, for 2.x), which callssocket.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
add a comment |
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
usesurllib3
, which uses the standard library'shttp.client
(orhttplib
, for 2.x), which callssocket.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
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 answers.mount()
)
– kcorlidy
Nov 27 '18 at 8:13
add a comment |
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
usesurllib3
, which uses the standard library'shttp.client
(orhttplib
, for 2.x), which callssocket.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
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
usesurllib3
, which uses the standard library'shttp.client
(orhttplib
, for 2.x), which callssocket.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
python python-2.7 python-requests
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 answers.mount()
)
– kcorlidy
Nov 27 '18 at 8:13
add a comment |
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 answers.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
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
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