P
Patrick Joyce
I needed to do a bit of complicated URL rewriting for a project I'm
working on. Apache's mod_rewrite's built in capabilities wouldn't do, so
I decided to make an External Rewriting Program
(http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritemap) to do
it.
All the examples I could find were in Perl, but I wanted to take a stab
at it in Ruby. What I have works most of the time, but occasionally
fails with what appears to be a concurrency issue.
Here is a simplified version of what I have:
---------------------
#!/opt/csw/bin/ruby
# Turn off buffering
STDIN.sync = true
STDOUT.sync = true
# Enter loop
while (STDIN)
host = gets
if host =~ /^(.+)\.somedomain\.com$/
puts $1
else
puts 'NULL'
end
end
---------------------
And here are the pertinent rewrite_log entries ("key" is what is passed
to my program via STDIN, "val" is what my program returns to STDOUT):
---------------------
[mysubdomain.somedomain.com/sid#81b3d48][rid#837ef38/initial] (5) map
lookup OK: map=lookup_subdomain key=mysubdomain.somedomain.com ->
val=msbomain
[mysubdomain.somedomain.com/sid#81b3d48][rid#837ef38/initial] (5) map
lookup OK: map=lookup_subdomain key=mysubdomain.somedomain.com ->
val=yudmysubdomain
---------------------
So... "mysubdomain.somedomain.com" is passed via STDIN to my program
twice. The first time returns "msbomain" and the second returns
"yudmysubdomain"
Isn't this program single threaded? Any ideas as to how my output is
being interleaved?
I'm running ruby 1.8.5 (2006-12-25 patchlevel 12) [i386-solaris2.8] on a
Joyent Accelerator.
Thanks is advance for your help.
- Patrick Joyce
working on. Apache's mod_rewrite's built in capabilities wouldn't do, so
I decided to make an External Rewriting Program
(http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritemap) to do
it.
All the examples I could find were in Perl, but I wanted to take a stab
at it in Ruby. What I have works most of the time, but occasionally
fails with what appears to be a concurrency issue.
Here is a simplified version of what I have:
---------------------
#!/opt/csw/bin/ruby
# Turn off buffering
STDIN.sync = true
STDOUT.sync = true
# Enter loop
while (STDIN)
host = gets
if host =~ /^(.+)\.somedomain\.com$/
puts $1
else
puts 'NULL'
end
end
---------------------
And here are the pertinent rewrite_log entries ("key" is what is passed
to my program via STDIN, "val" is what my program returns to STDOUT):
---------------------
[mysubdomain.somedomain.com/sid#81b3d48][rid#837ef38/initial] (5) map
lookup OK: map=lookup_subdomain key=mysubdomain.somedomain.com ->
val=msbomain
[mysubdomain.somedomain.com/sid#81b3d48][rid#837ef38/initial] (5) map
lookup OK: map=lookup_subdomain key=mysubdomain.somedomain.com ->
val=yudmysubdomain
---------------------
So... "mysubdomain.somedomain.com" is passed via STDIN to my program
twice. The first time returns "msbomain" and the second returns
"yudmysubdomain"
Isn't this program single threaded? Any ideas as to how my output is
being interleaved?
I'm running ruby 1.8.5 (2006-12-25 patchlevel 12) [i386-solaris2.8] on a
Joyent Accelerator.
Thanks is advance for your help.
- Patrick Joyce