West Ham held Lyon to a 1-1 draw in the first leg of their Europa League quarter-final, despite playing the whole second period and eight minutes of injury time with ten men.
The first half passed largely without incident until a major flashpoint in stoppage time as Aaron Cresswell was shown a straight red card in controversial circumstances.
Lyon controlled possession in the opening exchanges without threatening too often. Moussa Dembele went closest ten minutes in when Lucas Paqueta's cross essentially hit him and flew narrowly wide.
The hosts crafted an opening of their own after a quarter of an hour, with Said Benrahma holding off his man in the left channel before forcing Anthony Lopes into a decent save from the angle.
The London Stadium held its collective breath when Houssem Aouar went down under Ryan Fredericks' challenge in the penalty area, but the midfielder's appeal was waved away and West Ham survived the inevitable VAR review. Replays showed the right-back had made some contact with his man.
Then came the game-changing moment in first-half injury time. Dembele latched onto Aouar's through ball and was tugged back by Cresswell on the edge of the box, although a heavy touch appeared to be taking the Lyon man a little wide.
However, referee Felix Zwayer went straight to his back pocket and gave the full-back his marching orders, with VAR upholding the decision. The half-time whistle soon followed, and a furious David Moyes was shown a yellow card for his protests.
Fuelled by that perceived injustice, West Ham forced an opener early in the second half. Jerome Boateng mis-controlled the ball in the area and it rolled to Jarrod Bowen, whose strike took a huge deflection off the experienced German defender to lift it over the onrushing goalkeeper.
Tottenham loanee Tanguy Ndombele went close from range shortly before the hour mark, but his effort was always veering wide of the post. He wouldn't have to wait long for a goal, though, as he gleefully tapped home after Fredericks inadvertently knocked Tete's low cross into his path.
The Hammers' best opening of the half came when Bowen played an inch-perfect low cross into Antonio's path in acres of space, but somehow neither he nor the onrushing goalkeeper were able to make contact with the ball.
Lyon probed for the remainder of the match but were unable to create anything of note as they went in search of a winner. Alphonse Areola was unable to hold Paqueta's rasping drive with 12 minutes left on the clock, but fortunately for West Ham, no-one was on hand to punish him.
Eight minutes of stoppage time were added on and Les Gones had two more half-chances, with Dembele sending a header over before Areola was forced to beat away a low strike from Chelsea loanee Emerson.
It ended all square. Here's how the players rated...
West Ham player ratings
1. Goalkeeper & defenders
Alphonse Areola (GK) - 5/10 - Very accurate kicking up to Antonio. Barely tested but didn't quite do enough to cut out Tete's cross before the leveller.
Ryan Fredericks (RB) - 6/10 - Perhaps lucky to escape punishment after just catching the dangerous Aouar in the box. Unfortunately got himself into a twist and put the ball into Ndombele's path. Solid otherwise.
Craig Dawson (CB) - 7/10 - As usual he seemed to be in the way constantly. A typically battling defensive display. Three HUGE sliding tackles in stoppage time.
Kurt Zouma (CB) - 7/10 - Got into double figures for clearances, reflecting the nature of the task after the red card. Like his partner, put his body on the line.
Aaron Cresswell (LB) - 3/10 - Serviced Said Benrahma well down their flank. Shown a straight red card for pulling down Dembele. Harsh.
Tomas Soucek (CM) - 6/10 - A little ragged at times but did what was required, breaking up Lyon's play and disrupting the midfield.
Declan Rice (CM) - 7/10 - Some sublime passing but West Ham struggled to get him on the ball initially. Influence grew at both ends. Won the vast majority of his duels on the ground and aerially.
Pablo Fornals (AM) - 7/10 - Always a willing runner. Caused a nuisance, intercepting the ball and charging into the box before the ball broke to Bowen to open the scoring.
Jarrod Bowen (RW) - 8/10 - Ran hard to little avail before capitalising on Boateng's horrible error and doing enough to squeeze the ball home. Booked.
Michail Antonio (ST) - 6/10 - Played the roll of the backboard whenever a long ball came his way. Fluffed his one sight of goal but worked tirelessly. Booked.
Said Benrahma (LW) - 5/10 - Got into some good positions but frustrated with his end product. Sacrificed for Ben Johnson at half-time.
Ben Johnson (LB) - 5/10 - Gave Tete too much time and space before the leveller. Eventually settled and made some important defensive interventions.