مصطفی که در زمینه امنیت اطلاعات شخص بسیار حرفهای میباشد، پیشنهاد داده است که تعداد درخواستهای قابل ارسال به `api` که در سوال [سوال دوم مسابقه](https://quera.ir/contest/assignments/35250/problems/128198) نوشته شده است را به شکلی محدود کنیم که بتواند حملات احتمالی به سیستم را کنترل نماید. برای همین منظور شما باید پاسخ سوال [سوال دوم مسابقه](https://quera.ir/contest/assignments/35250/problems/128198) را به گونهای که در زیر توضیح داده شده است اصلاح نمایید.
برای دانلود پروژهی اولیه روی [این لینک](/problemset/assignments/4367/download_problem_initial_project/129785/) کلیک کنید.
# محدودیت rate-limit
در این `api` هر `client-key` مجاز باشد
در هر دقیقه حداکثر ۱۰ request ارسال کند.
یعنی هر کلاینت اگر در ۶۰ ثانیهی اخیر ۱۰ request ارسال کرده باشد باید برای request بعدی خود ۶۰ ثانیه منتظر بماند.
در صورتی که تعداد request های یک `client-key` از این محدودیت بیشتر شد؛
پاسخها به درخواستهای آن `client-key` باید
**تا یک دقیقه** دارای مشخصات زیر باشد:
- Status code: `429`
- Body:
```json
{"message": "Too many request from <client-key>"}
```
**مقدار `<client-key>` در `message` باید بر اساس هدر `client-key` درخواست جایگذاری شود.**
برای rate limit **مجاز به استفاده از nginx نیستید** و باید با توجه به زبان مورد نظر خود، پیادهسازی را در آن زبان انجام دهید. (به نحوه ارسال پاسخ و فایلهای مجاز در انتهای سوال دقت نمایید.)
---
# نکات تکمیلی
<details class="blue">
<summary>
نصب نیازمندیها و اجرا
</summary>
برای حل این سؤال میتوانید از هر زبان و هر تکنولوژیای که میخواهید استفاده کنید. بهصورتی که در یک پوشه به نام `api` کد برنامه را نوشته و در فایلی به نام `runner.sh` که توسط `sh` اجرا میشود، باید برنامهی خود را اجرا کنید. توجه کنید که حتماً باید `Dockerfile` مربوط به پروژهی خود را برای ما ارسال کنید.
در پروژهی اولیه، ۴ داکرفایل برای `php`، `python`، `golang` و `node` قرار دادیم که میتوانید از آنها مستقیماً استفاده کنید. در صورتی که از یکی از این زبانها برای حل سؤال استفاده میکنید، کافیست که `Dockerfile` مربوط به آن را در پوشهی `api` کپی کنید و طبق توضیحات داده شده، سؤال را حل کنید. برای نصب نیازمندیهای پایتون از `requirements.txt`، برای پیاچپی از `composer.json`، برای گولنگ از `go.mod` و برای نودجیاس از `package.json` استفاده کنید.
در صورتی که زبان مورد استفادهی شما، چیزی به جز این ۴ مورد است، باید خودتان داکرفایلی در پوشهی `api` بهشکلی بنویسید که بتواند نیازمندیهای پروژهی شما را نصب کرده و برنامهی شما را مانند داکرفایلهای موجود اجرا کند.
</details>
<details class="green">
<summary>
تغییر `Dockerfile`
</summary>
شما آزادید که `Dockerfile` را به هرصورتی که علاقمندید تغییر دهید. در صورتی که با داکر و داکرفایل آشنایی ندارید، هم کافیست که با استفاده از توضیحات داده شده صرفاً با پیادهسازی این `API` سؤال را حل کنید.
</details>
<details class="red">
<summary>
فرد بیهویت
</summary>
نکتهی مهمی که در این `API` وجود دارد این است که درصورتی که هدر `CLIENT-KEY` وجود نداشت، آخرین وضعیت باید در پاسخ برگردانده شود. درواقع تعداد ریکوئستهایی که فردی بیهویت به `API` میزند شمرده نمیشود؛ ولی state کلی تا آن لحظه برگردانده میشود:
```json
{
"state": {
"client-key-arvancloud": 5,
"client-key-quera": 7,
"client-key-bood-key-bood-man-naboodam": 35
}
}
```
</details>
## نحوه ارسال پاسخ
شما میتوانید تمامی محتوای موجود در پوشهی `api` را تغییر دهید و هر فایلی که میخواهید اضافه یا کم کنید.
```text
api
├── <mark class="purple" title="نام این فایل اهمیتی ندارد"> api.py </mark> # or main.go somefile.js anyfile.php name.any ...
├── Dockerfile
├── requirements.txt # or go.mod package.json composer.json
└── runner.sh
```
توجه کنید که نام فایل کد شما برای سیستم داوری اهمیتی ندارد و این خود شما هستید که در `runner.sh` از نام آن برای اجرای پروژه استفاده میکنید.
در نهایت این پوشه را _zip_ کرده و ارسال کنید. توجه کنید که پس از _extract_ کردن فایل _zip_ شما، باید پوشهی `api` را ببینیم که درون آن `Dockerfile` وجود دارد.