title: How to detect mobile phone from http request using rack middleware
body: <p>I have a rails app and I am using <a href="https://github.com/talison/rack-mobile-detect" rel="nofollow">rack-mobile-detect</a> to provide different responses to mobile phones.  Now I am trying to cache these responses and the problem is that rack-mobile-detect tags tablets as well as phones so I can't key on the rack-mobile-detect header.  It seems to me that the best thing to do is to modify rack-mobile-detect so that it only detects phones but I am having trouble figuring it out.  It wouldn't need to be 100%, if a few obscure phones slipped through that wouldn't be a big deal so long as no regular browsers were tagged as phones.  Here is the relevant code:</p>
  
  <pre><code>def initialize(app, options = {})
    @app = app
    @regex_ua_targeted = options[:targeted] || /iphone|android|ipod|ipad/i
    @regex_accept = /vnd\.wap/i
    @regex_ua_catchall = options[:catchall] ||
      Regexp.new('palm|blackberry|nokia|phone|midp|mobi|symbian|chtml|ericsson|minimo|' +
          'audiovox|motorola|samsung|telit|upg1|windows ce|ucweb|astel|plucker|' +
          'x320|x240|j2me|sgh|portable|sprint|docomo|kddi|softbank|android|mmp|' +
          'pdxgw|netfront|xiino|vodafone|portalmmm|sagem|mot-|sie-|ipod|up\\.b|' +
          'webos|amoi|novarra|cdm|alcatel|pocket|ipad|iphone|mobileexplorer|' +
          'mobile', true)
  end
  
  def call(env)
    device = nil
    user_agent = env.fetch('HTTP_USER_AGENT', '')
    device = Regexp.new(@regex_ua_targeted).match(user_agent)
    device ||= env.keys.detect { |k| k.match(/^HTTP(.*)_PROFILE$/) } != nil
    device ||= Regexp.new(@regex_accept).match(env.fetch('HTTP_ACCEPT','')) != nil
    device ||= Regexp.new(@regex_ua_catchall).match(user_agent) != nil
    if device
      device = device.to_s
      env[X_HEADER] = device
    end
    @app.call(env)
  end
  </code></pre>
  
  <p>so my question is:  What would be the best way to modify this so that it only detects phones and not tablets?  Does anyone know of a regex which is effective for this purpose?  Any help is greatly appreciated.</p>