Hooray! It's Friday (Weekend in bloody middle east) and time to write a blog post. And wish you are good.
In a troubleshoot problem we had a cute experience yesterday. And It was about '403 Forbidden Error' from company's server to a third party business's API.
Everything was fine until this week. And no code was changed, nothing in network was moved, no new firewall policy was applied, and everything was totally same as previous weeks.
But Server B (which requests last image from Server A), was accepting 'HTTP Error 403' and everyone was shocked. Out IIS logs also confirmed that it was our side.
We just reviewed App 1 and App 2 codes. The idea behind App 1 is to download images from cameras, using
ffmpeg, convert them and keep a copy of that for archive and store last image in a directory, with a specific name, so App 2 (Which is a
asmx web service also), can wait for a request from Server B to send image byte array as response.
1- Double-checked network architecture and gained permission to review network engineers reports: nothing.
git changes: nothing.
3- Double-checked the SOAP API changes with third-party business: No changes was applied, and We were the only contractor who had this error.
4- Reviewed the code, database was OK, and only thing which is not under our control is File System who is the accused 🔍🎩 !
5- Reviewed the
GetFiles() function documentation from Microsoft website. Took a look in Exceptions section and Voilà!
The caller does not have the required permission.
6- Definitely it was
GetFiles() but why? Maybe when
ffmpeg was downloading and converting image (APP 1), App 2 was requesting the file because of critical section we web service was broken. That was also wrong because
ffmpeg's has a different behavior that creates the file at the end, and instantly release it.
7- Key question: Which user is running App 1?: Administrator. And which user is running App 2?: IIS_IUSRS! that's it!
8- App 1 is triggered from Windows Scheduler every one minute to take a snapshot, and we just simply set user as IIS_IUSRS in scheduler tasks from
Change User or Group.
Not always it's because of code. Don't blame developers!
Maybe IIS has a list in cache which when a file creates in it's website directory, that list keeps permission details about that file, so when
ffmpegcreates the file and then updates the permissions after logic end, IIS does not update the file details instantly after modification. And this will cause exceptions in higher layers, especially when folder gets heavier in time.
powershellmore. All those stuff could be simply handled using
.batand basic Windows commands. Complexity makes troubleshooting difficult.
Comment any code, any where, even if it is as simple as a
foreach thing in GetFiles()
When it comes to a code which is going to run million times a day, check each obvious line of code again, and Copy-Paste potential errors from documentation to code comments with link and details.
Hope you will let me know if there is any comments. Thank you!