http: propagate the credentials callback's error code When we ask for credentials, the user may choose to return EUSER to indicate that an error has happened on its end and it wants to be given back control. We must therefore pass that back to the user instead of mentioning that it was on_headers_complete() that returned an error code. Since we can, we return the exact error code from the user (other than PASSTHROUGH) since it doesn't cost anything, though using other error codes aren't recommended.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
diff --git a/src/transports/http.c b/src/transports/http.c
index e3d90de..87f3ee8 100644
--- a/src/transports/http.c
+++ b/src/transports/http.c
@@ -36,6 +36,8 @@ static const char *post_verb = "POST";
#define PARSE_ERROR_GENERIC -1
#define PARSE_ERROR_REPLAY -2
+/** Look at the user field */
+#define PARSE_ERROR_EXT -3
#define CHUNK_SIZE 4096
@@ -78,6 +80,7 @@ typedef struct {
git_vector www_authenticate;
enum last_cb last_cb;
int parse_error;
+ int error;
unsigned parse_finished : 1;
/* Authentication */
@@ -351,7 +354,8 @@ static int on_headers_complete(http_parser *parser)
if (error == GIT_PASSTHROUGH) {
no_callback = 1;
} else if (error < 0) {
- return PARSE_ERROR_GENERIC;
+ t->error = error;
+ return t->parse_error = PARSE_ERROR_EXT;
} else {
assert(t->cred);
@@ -712,6 +716,10 @@ replay:
goto replay;
}
+ if (t->parse_error == PARSE_ERROR_EXT) {
+ return t->error;
+ }
+
if (t->parse_error < 0)
return -1;