ISAPI Filters

Είναι λίγος καιρός που έχω αρχίσει να χρησιμοποιώ το wordpress. Εστησα (παραμετροποίησα δηλαδή) αυτό το blog, σε έναν δωρεάν λογαριασμό αλλά είναι κάποια πράγματα που δεν μου αρέσουν. Το πρώτο και βασικότερο είναι ότι δεν σε αφήνει – επαναλαμβάνω στον δωρεάν λογαριασμό – να αλλάξεις την εμφάνιση, και μετά ότι δεν υποστηρίζει ms sql server (βασικά με ενδιαφέρει ο ms sql server 2000). Θα βολευτώ όμως προς το παρόν με ότι δίνει.

Ενα χαρακτηριστικό όμως που μου αρέσει – και φαντάζομαι ότι δεν έχει και τόσο σχέση το WordPress, όσο ο Apache ή ο Lightspeed που χρησιμοποιεί το wordpress.com, είναι η εκτενής χρήση του mod-rewrite, ώστε τα URLs να είναι πιο απλά στο ανθρώπινο μάτι. Ολα τα υπόλοιπα που διαβάζω για τις search engines σε σχέση με τις σελίδες που έχουν παραμέτρους στο URL τους, για μένα είναι “φλούδες” (να μην χρησιμοποιήσω άλλη έκφραση). Αν αυτός που έχει γράψει την μηχανή αναζήτησης είναι “μπακάλης” μη σώσει και αποθηκεύει σωστά τη διεύθυνση της. Τις εποχές που η διεύθυνση μιας σελίδας ήταν μόνο ότι σήμερα θα υπήρχε μέχρι το `?` με μόνο στατικό περιεχόμενο, τα μαμούθ ήταν στο forte τους ακόμα. Τέλος πάντων.

Φυσικά υπάρχουν αντίστοιχα με το mod-rewrite για το IIS των Windows μόνο που υλοποιούνται σαν ISAPI filters. Το αρνητικό είναι ότι τα περισσότερα δεν είναι δωρεάν αλλά ακόμα και τα περισσότερα από τα δωρεάν δεν δίνουν τον κώδικα. Αν ψάξεις λίγο στο internet και το msdn φυσικά θα βρεθούν κάποια παραδείγματα για να ξεκινήσει κανείς. Από αυτό ξεκίνησα κι εγώ για να (αντι)γράψω τον κώδικα μου, μετά το αρχικό ερέθισμα του wordpress. Δεν ήθελα όμως να χρησιμοποιήσω regular expressions, παρά απλή αντικατάσταση των παραμέτρων. Τα regular expressions ναι μεν είναι πολύ δυνατό εργαλείο, αλλά και πολύ βαρύ γι’ αυτό που θέλω να κάνω. Πρώτα απ’ όλα δεν είναι σίγουρο ποιά θα είναι η σειρά των παραμέτρων που θα περαστούν σε μια σελίδα. Μπορεί ο χρήστης να δώσει οποιονδήποτε συνδυασμό με το χέρι π.χ.:

  • http://some-url?param1=value1&param2=value2&param3=value3
  • http://some-url?param2=value2
  • http://some-url?param3=value3&param1=value1

Ξεκίνησα να κάνω την πρώτη μου προσπάθεια διαβάζοντας το url που δίνει ο χρήστης (ή το link) στον browser. Κάνω τις όποιες αντικαταστάσεις και ξαναστέλνω πίσω το τροποποιημένο url. Αυτό θα μπορούσε να γίνει με δύο τρόπους: url redirect το οποίο όμως θα μου αλλάξει τελικά την διέυθυνση που δείχνει ο browser στην νέα τροποποιημένη και url rewrite που αφήνει την διεύθυνση έτσι όπως την είχε δώσει ο χρήστης. Το δεύτερο είναι αυτό που με ενδιαφέρει και είναι αυτό που υλοποίησα. Αφού έπαιξαν οι πρώτες δοκιμές πρόσθεσα και ένα πολύ απλό αρχείο παραμετροποίησης ‘config.ini’ στο οποίο μπαίνει σε κάθε 1η γραμμή το string που θα ψάξει και σε κάθε 2η το string που θα αντικαταστήσει. Αλλά αν ήθελες να αλλάξεις την παραμετροποίηση στο config.ini θα έπρεπε να σταματήσεις τον web server και να τον ξαναξεκινήσεις για να φορτώσει το config.ini πάλι από την αρχή.

Αυτό το πρόβλημα λύθηκε πολύ απλά ορίζοντας ένα συγκεκριμένο url (http://<host>/reset) ώς `εντολή` που αναλαμβάνει να κάνει αυτό ακριβώς το πράγμα: Να ξαναδιαβάσει την παραμετροποίηση από το config.ini. Για να δώ αν η παραμετροποίηση έκανε τις αντικαταστάσεις όπως τις ήθελα, κάθε url που χειρίζεται – πρώτα το αρχικό και μετά το επεξεργασμένο – γράφεται σε ένα log αρχείο. Αυτό ίσως να δημιουργούσε πρόβλημα στον web server αφού με τον καιρό το log θα μεγάλωνε, οπότε μπήκαν 3 νέες `εντολές` (http://<host>/uselog, http://<host>/skiplog, http://<host>/logstatus). Για να εμφανίζονται βέβαια αυτές οι πληροφορίες και το αποτέλεσμα των ενεργειών φτιάχτηκαν και μερικές εξαιρετικά απλές html σελίδες. Αρχικά σκεφτόμουν να αντιγράφω τα html αρχεία μαζί με το dll, αλλά δεν είναι καλύτερο να διανέμεις μόνο ένα αρχείο αντί για 4 ή 14; Οπότε προσπάθησα να ενσωματώσω τα html αρχεία μέσα στα resources του dll. Για να παραμείνει όσο το δυνατόν πιο απλή η υλοποίηση (αλλά και για να δοκιμάσω να εμφανίζω πληροφορίες που έχω στα resources του dll) το φίλτρο στέλνει, όταν καλείται κάποια `εντολή`, κατευθείαν στον browser την html σελίδα όπως την διαβάζει από τα resources χωρίς καμία επιπλέον επεξεργασία. Απλή html χωρίς πολλά πολλά.

Κατεβάστε τον κώδικα όπως και το dll.