In the last post, I built an executable which created a URLRequestContext
and then exited. Not very exciting, but it was a bit of work! In this post, I'll be using that instance to create an actual URLRequest.
URLRequestContext::CreateRequest
A skim of url_request_context.h
shows a helpful-looking function, CreateRequest
.
This takes a few straightforward arguments plus a NetworkTrafficAnnotationTag
, and the comments focus on that type. Unfortunately, network_traffic_annotation.h
doesn't contain a lot of comments that might help me understand what this is and what it does. Running codehistory on the file doesn't show much, either. From what I can guess, this is some kind of annotation that can be found in the source code and reviewed or audited. Anyway, in one of the commits that modified this file I find net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)
. That didn't work immediately, but I see that the MutableNetworkTrafficAnnotationTag
has an explicit cast operator to NetworkTrafficAnnotationTag
, which does.
The types work out, and the compile succeeds, but it seems I've still not squared away the task runners:
[0509/212941.923727:FATAL:url_request.cc(597)] Check failed: base::SingleThreadTaskRunner::HasCurrentDefault().
I thought I had handled this in the last post, so this was a bit disappointing. One of things about Chromium that I'm adjusting to is that a lot of the information is stored in people, and not as data. So, I asked a few people via chat, and their responses improved my understanding of things a little. One suggestion was to look at other one-off executables like net_watcher
, or to use base::test::TaskEnvironment
. But I wanted to learn what was going on, rather than just getting things done. With a little more digging, I determined that SingleThreadTaskRunner
is a subclass of SequentialTaskRunner
that is capable of running tasks on the same thread, if they have some reason to be tied together like that. This is contrary to some other suggestions that SingleThreadTaskRunner
is only for testing!
Anyway, switching
- auto thread_runner = base::ThreadPool::CreateSequentialTaskRunner(
+ auto thread_runner = base::ThreadPool::CreateSingleThreadTaskRunner(
{base::TaskPriority::USER_VISIBLE});
fixed this issue.
Next Up
This was a pretty short post, mostly because I was only able to devote a few minutes at a time to this work. Next up, I will call the Start
method on the URLRequest
, which will require a URLRequest::Delegate
. Once the header is read, I'll call Read
to read the response body. The end is in sight!
Top comments (0)