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:
@return
dari method tersebut saya ganti dari\Closure
menjadi\GuzzleHttp\Psr7\RequestInterface
. Sebenarnya ini tidak memberi pengaruh secara langsung terhadap kode, tapi jelas dari sisi dokumentasi tipe data dari@return
tersebut tidak benar. Karena methodtap()
yang digunakan untuk memodifikasi variable$request
seharusnya mengembalikan$request
itu sendiri yaitu\GuzzleHttp\Psr7\RequestInterface
(Penjelasan lebih lanjut bisa dibaca di sini ya: @taylorotwell/tap-tap-tap-1fc6fc1f93a6).- Saya membuat variable baru
$callbackResult
untuk 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
$request
pada methodtap()
daneach()
saya ubah menjadi pass by reference sehingga perubahan yang dilakukan oleh$callbackResult
dapat 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 🙏