commit 91a6fbcf777ae94661a2a27fc4180dcb28d1f974 Author: Nick Mathewson nickm@torproject.org Date: Sun Apr 16 18:45:48 2017 -0400
Begin work to turn "directory request" into an object
This patch adds the object type, and makes all of the functions that used to feed into directory_initiate_command_rend() feed into that type instead. --- src/or/directory.c | 155 ++++++++++++++++++++++++++++++++++++++++++++++++++++- src/or/directory.h | 27 ++++++++++ 2 files changed, 180 insertions(+), 2 deletions(-)
diff --git a/src/or/directory.c b/src/or/directory.c index 1b999ee..d8aab26 100644 --- a/src/or/directory.c +++ b/src/or/directory.c @@ -1168,6 +1168,117 @@ directory_initiate_command(const tor_addr_t *or_addr, uint16_t or_port, if_modified_since, NULL, NULL); }
+struct directory_request_t { + tor_addr_port_t or_addr_port; + tor_addr_port_t dir_addr_port; + char digest[DIGEST_LEN]; + uint8_t dir_purpose; + uint8_t router_purpose; + dir_indirection_t indirection; + const char *resource; + const char *payload; + size_t payload_len; + time_t if_modified_since; + const rend_data_t *rend_query; + circuit_guard_state_t *guard_state; // XXXX Does this belong? +}; + +directory_request_t * +directory_request_new(uint8_t dir_purpose) +{ + tor_assert(dir_purpose >= DIR_PURPOSE_MIN_); + tor_assert(dir_purpose <= DIR_PURPOSE_MAX_); + tor_assert(dir_purpose != DIR_PURPOSE_SERVER); + tor_assert(dir_purpose != DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2); + + directory_request_t *result = tor_malloc_zero(sizeof(*result)); + result->dir_purpose = dir_purpose; + result->router_purpose = ROUTER_PURPOSE_GENERAL; + result->indirection = DIRIND_ONEHOP; + return result; +} +void +directory_request_free(directory_request_t *req) +{ + if (req == NULL) + return; + tor_free(req); +} + +void +directory_request_set_or_addr_port(directory_request_t *req, + const tor_addr_port_t *p) +{ + memcpy(&req->or_addr_port, p, sizeof(*p)); +} +void +directory_request_set_dir_addr_port(directory_request_t *req, + const tor_addr_port_t *p) +{ + memcpy(&req->dir_addr_port, p, sizeof(*p)); +} +void +directory_request_set_directory_id_digest(directory_request_t *req, + const char *digest) +{ + memcpy(req->digest, digest, DIGEST_LEN); +} +void +directory_request_set_router_purpose(directory_request_t *req, + uint8_t router_purpose) +{ + tor_assert(router_purpose == ROUTER_PURPOSE_GENERAL || + router_purpose == ROUTER_PURPOSE_BRIDGE); + // assert that it actually makes sense to set this purpose, given + // the dir_purpose. + req->router_purpose = router_purpose; +} +void +directory_request_set_indirection(directory_request_t *req, + dir_indirection_t indirection) +{ + req->indirection = indirection; +} +// DOCDOC lifetime +void +directory_request_set_resource(directory_request_t *req, + const char *resource) +{ + req->resource = resource; +} +// DOCDOC Lifetime +void +directory_request_set_payload(directory_request_t *req, + const char *payload, + size_t payload_len) +{ + tor_assert(DIR_PURPOSE_IS_UPLOAD(req->dir_purpose) || + // XXXX why not included? + req->dir_purpose == DIR_PURPOSE_UPLOAD_RENDDESC_V2); + + req->payload = payload; + req->payload_len = payload_len; +} +void +directory_request_set_if_modified_since(directory_request_t *req, + time_t if_modified_since) +{ + req->if_modified_since = if_modified_since; +} +// DOCDOC lifetime +void +directory_request_set_rend_query(directory_request_t *req, + const rend_data_t *query) +{ + req->rend_query = query; +} +void +directory_request_set_guard_state(directory_request_t *req, + circuit_guard_state_t *state) +{ + req->guard_state = state; +} + /** Same as directory_initiate_command(), but accepts rendezvous data to * fetch a hidden service descriptor, and takes its address & port arguments * as tor_addr_port_t. */ @@ -1175,14 +1286,54 @@ static void directory_initiate_command_rend(const tor_addr_port_t *or_addr_port, const tor_addr_port_t *dir_addr_port, const char *digest, - uint8_t dir_purpose, uint8_t router_purpose, + uint8_t dir_purpose, + uint8_t router_purpose, dir_indirection_t indirection, const char *resource, - const char *payload, size_t payload_len, + const char *payload, + size_t payload_len, time_t if_modified_since, const rend_data_t *rend_query, circuit_guard_state_t *guard_state) { + directory_request_t *r = directory_request_new(dir_purpose); + directory_request_set_or_addr_port(r, or_addr_port); + directory_request_set_dir_addr_port(r, dir_addr_port); + directory_request_set_directory_id_digest(r, digest); + directory_request_set_router_purpose(r, router_purpose); + directory_request_set_indirection(r, indirection); + if (resource) + directory_request_set_resource(r, resource); + if (payload) + directory_request_set_payload(r, payload, payload_len); + if (if_modified_since) + directory_request_set_if_modified_since(r, if_modified_since); + if (rend_query) + directory_request_set_rend_query(r, rend_query); + if (guard_state) + directory_request_set_guard_state(r, guard_state); + + directory_initiate_request(r); + + directory_request_free(r); +} + +void +directory_initiate_request(directory_request_t *request) +{ + const tor_addr_port_t *or_addr_port = &request->or_addr_port; + const tor_addr_port_t *dir_addr_port = &request->dir_addr_port; + const char *digest = request->digest; + const uint8_t dir_purpose = request->dir_purpose; + const uint8_t router_purpose = request->router_purpose; + const dir_indirection_t indirection = request->indirection; + const char *resource = request->resource; + const char *payload = request->payload; + const size_t payload_len = request->payload_len; + const time_t if_modified_since = request->if_modified_since; + const rend_data_t *rend_query = request->rend_query; + circuit_guard_state_t *guard_state = request->guard_state; + tor_assert(or_addr_port); tor_assert(dir_addr_port); tor_assert(or_addr_port->port || dir_addr_port->port); diff --git a/src/or/directory.h b/src/or/directory.h index 0c5db3e..18fe550 100644 --- a/src/or/directory.h +++ b/src/or/directory.h @@ -41,6 +41,31 @@ typedef enum {
int directory_must_use_begindir(const or_options_t *options);
+typedef struct directory_request_t directory_request_t; +directory_request_t *directory_request_new(uint8_t dir_purpose); +void directory_request_free(directory_request_t *req); +void directory_request_set_or_addr_port(directory_request_t *req, + const tor_addr_port_t *p); +void directory_request_set_dir_addr_port(directory_request_t *req, + const tor_addr_port_t *p); +void directory_request_set_directory_id_digest(directory_request_t *req, + const char *digest); +void directory_request_set_router_purpose(directory_request_t *req, + uint8_t router_purpose); +void directory_request_set_indirection(directory_request_t *req, + dir_indirection_t indirection); +void directory_request_set_resource(directory_request_t *req, + const char *resource); +void directory_request_set_payload(directory_request_t *req, + const char *payload, + size_t payload_len); +void directory_request_set_if_modified_since(directory_request_t *req, + time_t if_modified_since); +void directory_request_set_rend_query(directory_request_t *req, + const rend_data_t *query); +void directory_request_set_guard_state(directory_request_t *req, + struct circuit_guard_state_t *state); + MOCK_DECL(void, directory_initiate_command_routerstatus, (const routerstatus_t *status, uint8_t dir_purpose, @@ -63,6 +88,8 @@ void directory_initiate_command_routerstatus_rend(const routerstatus_t *status, const rend_data_t *rend_query, struct circuit_guard_state_t *guard_state);
+void directory_initiate_request(directory_request_t *request); + int parse_http_response(const char *headers, int *code, time_t *date, compress_method_t *compression, char **response);
tor-commits@lists.torproject.org