Pull Request Pertama Saya di Laravel Framework — Part 2

Check this article on Medium: @ngodingbang/pull-request-pertama-saya-di-laravel-framework-part-2-1b03fbdaf3c1
This article has been translated into English version: My First Pull Request to Laravel Framework — Part 2

Part sebelumnya sudah pernah saya jelaskan di sini: Pull Request Pertama Saya di Laravel Framework — Part 1. Bagi kamu yang penasaran dengan ceritanya, silakan dibaca dulu yak :)
Apa Sebenarnya Bug yang Saya Temukan Pada Saat Itu?
Jadi pada saat itu saya ingin menambahkan sebuah request header ketika mengirim HTTP Request menggunakan fitur HTTP Client yang ada di Laravel. Tapi penambahan request header tidak bisa dilakukan menggunakan method withHeaders() karena nilai dari request header tersebut bersifat dinamis dan mengandalkan alamat URL yang akan dituju oleh HTTP Request.

Alhasil saya menggunakan method beforeSending() yang disediakan dan menambahkan request header dengan cara membuat callback sebagai berikut.

Saya tidak bisa menggunakan method withHeaders() dari parameter Illuminate\Http\Client\PendingRequest $pendingRequest untuk menambahkan request header baru.
$pendingRequest->withHeaders([‘Authorization’ => ‘Bearer ‘.$requestLine]);
Hal ini terjadi karena parameter $pendingRequest sudah ter-instantiate duluan sebelum method HTTP::beforeSending() dipanggil, sehingga penggunaan method withHeader() pada parameter $pendingRequest tidak akan ada gunanya. Jadi satu-satunya cara untuk menambahkan request header pada HTTP Client di atas adalah dengan menggunakan method withHeader() yang disediakan oleh parameter Illuminate\Http\Client\Request $request.
$request->toPsrRequest()->withHeader(‘Authorization’, ‘Bearer ‘.$requestLine);
Ketika kita menggunakan HTTP::beforeSending(), maka yang terjadi sebenarnya adalah callback yang telah dibuat sebelumnya akan didaftarkan ke dalam property pada class PendingRequest seperti berikut.

Lalu seluruh callback yang sudah terdaftar akan dijalankan menggunakan method runBeforeSendingCallbacks() milik class PendingRequest seperti berikut.

Di sinilah masalah tersebut mulai muncul. Ketika menggunakan cara di atas, request header tidak berubah sama sekali. Saya terus mengutak-atik kode yang saya buat, namun hasilnya tetap saja tidak menunjukkan perubahan yang berarti. Request header yang sudah saya tambahkan pada callback sebelumnya tetap tidak terkirim pada HTTP Client.

Bagaimana Cara Saya Memecahkan Bug Tersebut?

Awalnya saya tidak mengerti kenapa hal ini bisa terjadi. Tapi setelah mengulik lebih jauh, akhirnya saya menemukan akar masalahnya. Ternyata method runBeforeSendingCallbacks() di class PendingRequest yang digunakan untuk menjalankan HTTP::beforeSending() tidak berjalan seperti yang diharapkan. Akhirnya saya coba men-tweak kode di class PendingRequest sebagai berikut.

Jadi dari tweak tersebut, ada beberapa perubahan yang saya lakukan. Di antaranya:
@returndari method tersebut saya ganti dari\Closuremenjadi\GuzzleHttp\Psr7\RequestInterface. Sebenarnya ini tidak memberi pengaruh secara langsung terhadap kode, tapi jelas dari sisi dokumentasi tipe data dari@returntersebut tidak benar. Karena methodtap()yang digunakan untuk memodifikasi variable$requestseharusnya mengembalikan$requestitu sendiri yaitu\GuzzleHttp\Psr7\RequestInterface(Penjelasan lebih lanjut bisa dibaca di sini ya: @taylorotwell/tap-tap-tap-1fc6fc1f93a6).- Saya membuat variable baru
$callbackResultuntuk menangkap hasil dari methodcall_user_func()yang sudah ada sebelumnya. Sehingga jika ada return value yang diberikan dari hasil eksekusi methodcall_user_func(), maka return value tersebut akan ditaruh ke variable$request. - Selanjutnya variable
$requestpada methodtap()daneach()saya ubah menjadi pass by reference sehingga perubahan yang dilakukan oleh$callbackResultdapat diteruskan sampai ke return value dari methodrunBeforeSendingCallbacks()itu sendiri.
Dari perubahan tersebut, maka request header yang sudah saya tambahkan pada callback sebelumnya akhirnya bisa terkirim pada HTTP Client seperti yang saya mau. Tentunya ada sedikit penyesuaian pada callback yang ada pada Http::beforeSending() seperti berikut.


Selanjutnya Apa?
Setelah melewati perjalanan yang berliku untuk menyelesaikan tersebut, saatnya men-submit bugfix ini ke Laravel. Tapi sepertinya cerita tersebut tidak muat jika saya taruh semuanya di part ini, jadi saya putuskan untuk membuatnya terpisah di part selanjutnya.
Pull Request Pertama Saya di Laravel Framework — Part 3
Bagi kamu yang penasaran atau mungkin ingin mencoba untuk membuat pull request ke Laravel, silakan lanjut ke part selanjutnya. Terima kasih sudah menyimak dan sampai jumpa di part selanjutnya! Arigatou 🙏




