Skip to main content

Gzip upload on browsers



Today, I faced a problem that I could not upload my archive file with gzip format on Firefox, even it worked on Chrome. I was using macOS. My application had a setting to whitelist accepted files. I’ve already added "application/gzip" to that list. "It’s strange!", I thought.

I finally figured out that my uploaded file's type actually was "application/x-gzip" on Firefox. I also asked my colleagues to check their uploaded files on Window and Ubuntu. Hmm… they were totally different! It was "application/x-compressed" on Window, and was "application/x-compressed-tar" on Ubuntu.

In fact, gzip is already standardized by IANA. There is a note in RFC-6713 as below:

"Some applications have informally used media types such as application/gzip-compressed, application/gzipped, application/x-gunzip, application/x-gzip, application/x-gzip-compressed, and gzip/document to describe data compressed with gzip. The media types defined in this document should replace those media types in future applications."

As you can see, the difference of media types among browsers still persists as of this writing. That was the root cause!

Therefore, I had to added all media types including "application/zip,application/x-gzip,application/x-compressed,application/x-compressed-tar" in my app's whitelist.

Comments

  1. anh làm một blog về sự quan trọng của tiếng anh ( speaking, writing ) đi anh. Một dev có được skill viết như anh thì có được đãi ngộ gì đặc biệt hơn kh ạ

    ReplyDelete
    Replies
    1. Để mình kể cho bạn nghe câu chuyện học tiếng Anh của mình để xem nó quan trọng thế nào với mình nhé. Thực ra, ban đầu động lực học tiếng Anh duy nhất của mình là cố gắng "sống sót" trong môi trường làm việc sử dụng tiếng Anh để giao tiếp. Lúc đó, trong team mình còn "bị đánh giá" là hạng D (trong thang điểm A, B, C, D). Ghê chưa! Nhìn xung quanh sao người ta ai cũng giỏi, ai cũng hay quá, thế là mình hạ quyết tâm học cho bằng được. Trong lúc người ta còn ngủ, mình phải dậy sớm học tiếng Anh; trong lúc người ta nghỉ trưa, mình học tiếng Anh; và trong lúc người ta đi xem phim tối, mình học tiếng Anh. Trong vòng 6 tháng như vậy thì mình đã tự tin ra hẳn, nói được và nghe được. Từ đó, mình cảm thấy tiếng Anh là một thứ gì đó không thể thiếu hằng ngày. Mình có thể đọc sách tiếng Anh, xem phim tiếng Anh, học khoá học tiếng Anh, đi meetup nói tiếng Anh, vân vân. Vậy là khi thành thạo nó thì bây giờ nó trở thành công cụ giúp mình tiếp nhận rất nhiều thông tin, học hỏi được nhiều thứ, và "enjoy" cuộc sống nhiều hơn.

      Trong môi trường sử dụng tiếng Anh để giao tiếp, nếu bạn có tiếng Anh tốt thì bạn mới giao tiếp tốt. Ngôn ngữ cũng giống như protocol trong phần mềm. Bạn phải hiểu và sử dụng đúng protocol thì hệ thống mới hoạt động đúng. Bạn giỏi tiếng Anh, bạn tự tin khi giao tiếp với khách hàng, bạn tự tin viết tài liệu, bạn tư tin xông pha học cái mới, bạn tự tin khi thuyết trình, vân vân. Bạn sẽ được giao nhiều việc quan trọng và mang lại nhiều giá trị cho công ty. Như vậy, vì cái "dich vụ" của bạn quá tốt, chắc chắn bạn phải thoả thuận được "giá cao". :)

      Delete

Post a Comment

Popular posts from this blog

Set up a web server for learning HTTP headers

Motivation We all follow the client-server model using the HTTP protocol for most of our web apps today. In development, we simply may have a backend API server and a frontend (web pages or mobile apps) only. However, it seemed that a proxy server is always required for production. In fact, most of the hardest issues in production come from integration. The requests and responses might be modified by the proxy server. Therefore, the understanding of HTTP protocol is one of the key skills to resolve those issues. I wanted to dive deep into HTTP with some core concepts such as caching, cookies, and CORS. I didn't intend to go quickly rather than moved slowly to have a well understanding of what I do. Prepare a server The easiest way is to use my laptop as a server then I can just use "localhost". I can also use ngrok to make my web server online. Finally, I use an online tool such as RedBot to check the HTTP headers. To make it more excited though, I deployed the app on A...

What the heck is Meteor DDP?

I was using Meteor for my messenger project. I was so curious about the real time connection. I wanted to know how exactly this mechanism works. In this post, I will go through the DDP Specification, an overview of WebSocket, and a simple demo about how to subscribe a publication of Rocket.Chat (containing a DDP server) from an external webpage. At a glance, I knew that Meteor invented a protocol called DDP which uses for handling real time connection. So then, what is DDP? "DDP (Distributed Data Protocol) is the stateful WebSocket protocol that Meteor uses to communicate between the client and the server." [1] All right! Why does DDP matter? "DDP is a standard way to solve the biggest problem facing client-side JavaScript developers: querying a server-side database, sending the results down to the client, and then pushing changes to the client whenever anything changes in the database" . [2] In order to understand deeply the protocol, I decided ...

The power of acceptance test

User Story is the place PO gives his ideas about features so that developers are able to know what requirements are. Acceptance tests are these show the most valuable things of the features represented by some specific cases. Usually PO defines them, but not always. Therefore, refining existing acceptance tests – even defining new ones that cover all features of the User Story must be a worth task. Acceptance test with Given When Then pattern If we understand what we are going to do, we can complete it by 50% I have worked with some members those just start implementing the features one by one and from top to down of the User Story description. Be honest, I am the one used to be. What a risky approach! Because it might meet a case that is very easy to miss requirements or needs to re-work after finding any misunderstood things. I have also worked with some members those accept spending a long time to clarify the User Story. Reading carefully of whole User Story by defining...

PSMDB - A MongoDB alternative for having Encryption At Rest

Encryption is the most popular tool for securing data both in transit and at rest. - For protecting data in transit, we can configure to use the TLS connection - For protecting data at rest, we can use Percona Server for MongoDB (PSMDB), an open-source alternative for MongoDB Enterprise. License PSMDB Docker images follow the SSPL license. Therefore, it is not a problem when I only have my containers deployed in on-premises environments. Running MongoDB Replication on OpenShift I have successfully installed the replication by following the guide Install Percona Server for MongoDB on OpenShift . In order to make it work properly with my needs, I disabled some features from the default deployment. See the detail in this change Basically, I needed to create a CRD (Custom Resource Definition) to let OpenShift/Kubernetes what PSMDB is. Then, I deployed the Operator pod. Finally, I deployed the PSMDB StatefulSet. I used NFS shares for Persistent Volumes. Create CRD for PSMDB 2 git clone http...

MS SQL Server Views

"Creates a virtual table whose contents (columns and rows) are defined by a query. Use this statement to create a view of the data in one or more tables in the database. For example, a view can be used for the following purposes: - To focus, simplify, and customize the perception each user has of the database. - As a security mechanism by allowing users to access data through the view, without granting the users permissions to directly access the underlying base tables. - To provide a backward compatible interface to emulate a table whose schema has changed." [1] Beside that, our team used view in order to improve the performance of our web apps when a database has a very complicated relationship between its tables by using ORM Frameworks such as Hibernate. Example code: --create CREATE VIEW placeholders AS SELECT EMPKEY AS empkey, CONNUMB AS connumb, EMPNBR AS empNbr, ACEEMPN AS empFirstName, ACEEMPFN AS empLastName, EMPNAM AS empFullName, ...