i_free(urlreq);
}
+static void imap_urlauth_request_drop(struct imap_urlauth_connection *conn,
+ struct imap_urlauth_request *urlreq)
+{
+ if ((conn->state == IMAP_URLAUTH_STATE_REQUEST_PENDING ||
+ conn->state == IMAP_URLAUTH_STATE_REQUEST_WAIT) &&
+ conn->targets_head != NULL &&
+ conn->targets_head->requests_head == urlreq) {
+ /* cannot just drop pending request without breaking
+ protocol state */
+ return;
+ }
+ imap_urlauth_request_free(urlreq);
+
+}
+
void imap_urlauth_request_abort(struct imap_urlauth_connection *conn,
struct imap_urlauth_request *urlreq)
{
} T_END;
}
- if (conn->state == IMAP_URLAUTH_STATE_REQUEST_PENDING &&
- conn->targets_head != NULL &&
- conn->targets_head->requests_head == urlreq) {
- /* cannot just drop pending request without breaking
- protocol state */
- return;
- }
- imap_urlauth_request_free(urlreq);
+ imap_urlauth_request_drop(conn, urlreq);
}
static void
{
struct imap_urlauth_fetch_reply reply;
imap_urlauth_request_callback_t *callback;
+ int ret = 1;
callback = urlreq->callback;
urlreq->callback = NULL;
reply.error = error;
T_BEGIN {
- (void)callback(&reply, urlreq->context);
+ ret = callback(&reply, urlreq->context);
} T_END;
}
- if (conn->state == IMAP_URLAUTH_STATE_REQUEST_PENDING &&
- conn->targets_head != NULL &&
- conn->targets_head->requests_head == urlreq) {
- /* cannot just drop pending request without breaking protocol state */
- return;
+ imap_urlauth_request_drop(conn, urlreq);
+
+ if (ret < 0) {
+ /* Drop any related requests upon error */
+ imap_urlauth_request_abort_by_context(conn, urlreq->context);
}
- imap_urlauth_request_free(urlreq);
+ if (ret != 0)
+ imap_urlauth_connection_continue(conn);
}
static void
param[6] != '\0') {
error = param+6;
}
+ conn->state = IMAP_URLAUTH_STATE_REQUEST_WAIT;
imap_urlauth_request_fail(conn,
conn->targets_head->requests_head, error);
return 1;